s3-prefork: provide means to expand the pool size
authorSimo Sorce <idra@samba.org>
Mon, 9 May 2011 08:51:47 +0000 (04:51 -0400)
committerAndreas Schneider <asn@samba.org>
Wed, 10 Aug 2011 16:14:03 +0000 (18:14 +0200)
Signed-off-by: Andreas Schneider <asn@samba.org>
source3/lib/server_prefork.c
source3/lib/server_prefork.h

index 0a8199a6ea47bffa3020fd927ec46216bc88bdb5..000539da0f1600a91fa46653446782b2880c30db 100644 (file)
@@ -116,6 +116,38 @@ bool prefork_create_pool(struct tevent_context *ev_ctx,
        return true;
 }
 
+/* Provide the new max children number in new_max
+ * (must be larger than current max).
+ * Returns: 0 if all fine
+ *         ENOSPC if mremap fails to expand
+ *         EINVAL if new_max is invalid
+ */
+int prefork_expand_pool(struct prefork_pool *pfp, int new_max)
+{
+       struct pf_worker_data *pool;
+       size_t old_size;
+       size_t new_size;
+
+       if (new_max <= pfp->pool_size) {
+               return EINVAL;
+       }
+
+       old_size = sizeof(struct pf_worker_data) * pfp->pool_size;
+       new_size = sizeof(struct pf_worker_data) * new_max;
+
+       pool = mremap(pfp->pool, old_size, new_size, 0);
+       if (pool == MAP_FAILED) {
+               DEBUG(3, ("Failed to mremap memory for prefork pool!\n"));
+               return ENOSPC;
+       }
+
+       memset(&pool[pfp->pool_size], 0, new_size - old_size);
+
+       pfp->pool_size = new_max;
+
+       return 0;
+}
+
 int prefork_add_children(struct tevent_context *ev_ctx,
                         struct prefork_pool *pfp,
                         int num_children)
index bf9f3d3fe7460ec30d695c40297289bb979e0693..19ba32dff079142a707d2edcfd956c339d463628 100644 (file)
@@ -61,6 +61,7 @@ bool prefork_create_pool(struct tevent_context *ev_ctx,
                         int min_children, int max_children,
                         prefork_main_fn_t *main_fn, void *private_data,
                         struct prefork_pool **pf_pool);
+int prefork_expand_pool(struct prefork_pool *pfp, int new_max);
 
 int prefork_add_children(struct tevent_context *ev_ctx,
                         struct prefork_pool *pfp,