You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by bn...@apache.org on 2003/05/20 17:12:57 UTC
cvs commit: httpd-2.0/server/mpm/netware mpm_netware.c
bnicholes 2003/05/20 08:12:57
Modified: server/mpm/netware Tag: APACHE_2_0_BRANCH mpm_netware.c
Log:
Make sure that bucket allocator for each worker thread is created from a thread
specific pool. This prevents multiple threads from trying to clean up the same
pool at the same time.
Revision Changes Path
No revision
No revision
1.62.2.7 +16 -9 httpd-2.0/server/mpm/netware/mpm_netware.c
Index: mpm_netware.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm/netware/mpm_netware.c,v
retrieving revision 1.62.2.6
retrieving revision 1.62.2.7
diff -u -r1.62.2.6 -r1.62.2.7
--- mpm_netware.c 26 Mar 2003 19:22:22 -0000 1.62.2.6
+++ mpm_netware.c 20 May 2003 15:12:57 -0000 1.62.2.7
@@ -212,12 +212,15 @@
ap_generation_t volatile ap_my_generation=0;
/* a clean exit from a child with proper cleanup */
-static void clean_child_exit(int code, int worker_num, apr_pool_t *ptrans, apr_bucket_alloc_t *bucket_alloc) __attribute__ ((noreturn));
-static void clean_child_exit(int code, int worker_num, apr_pool_t *ptrans, apr_bucket_alloc_t *bucket_alloc)
+static void clean_child_exit(int code, int worker_num, apr_pool_t *ptrans,
+ apr_bucket_alloc_t *bucket_alloc, apr_pool_t *pthrd) __attribute__ ((noreturn));
+static void clean_child_exit(int code, int worker_num, apr_pool_t *ptrans,
+ apr_bucket_alloc_t *bucket_alloc, apr_pool_t *pthrd)
{
if (!shutdown_pending) {
apr_bucket_alloc_destroy(bucket_alloc);
apr_pool_destroy(ptrans);
+ apr_pool_destroy(pthrd);
}
atomic_dec (&worker_thread_count);
@@ -357,7 +360,7 @@
void worker_main(void *arg)
{
ap_listen_rec *lr, *first_lr, *last_lr = NULL;
- apr_pool_t *ptrans;
+ apr_pool_t *ptrans, *pthrd;
apr_pool_t *pbucket;
apr_allocator_t *allocator;
apr_bucket_alloc_t *bucket_alloc;
@@ -385,7 +388,10 @@
apr_allocator_owner_set(allocator, ptrans);
apr_pool_tag(ptrans, "transaction");
- bucket_alloc = apr_bucket_alloc_create(pmain);
+ apr_pool_create(&pthrd, pmain);
+ apr_pool_tag(pthrd, "worker_thrd_pool");
+
+ bucket_alloc = apr_bucket_alloc_create(pthrd);
atomic_inc (&worker_thread_count);
@@ -398,7 +404,7 @@
if ((ap_max_requests_per_child > 0
&& requests_this_child++ >= ap_max_requests_per_child)) {
- clean_child_exit(0, my_worker_num, ptrans, bucket_alloc);
+ clean_child_exit(0, my_worker_num, ptrans, bucket_alloc, pthrd);
}
ap_update_child_status_from_indexes(0, my_worker_num, WORKER_READY,
@@ -411,7 +417,7 @@
for (;;) {
if (shutdown_pending || restart_pending || (ap_scoreboard_image->servers[0][my_worker_num].status == WORKER_IDLE_KILL)) {
DBPRINT1 ("\nThread slot %d is shutting down\n", my_worker_num);
- clean_child_exit(0, my_worker_num, ptrans, bucket_alloc);
+ clean_child_exit(0, my_worker_num, ptrans, bucket_alloc, pthrd);
}
/* Check the listen queue on all sockets for requests */
@@ -520,12 +526,13 @@
*/
ap_log_error(APLOG_MARK, APLOG_EMERG, stat, ap_server_conf,
"apr_accept: giving up.");
- clean_child_exit(APEXIT_CHILDFATAL, my_worker_num, ptrans, bucket_alloc);
+ clean_child_exit(APEXIT_CHILDFATAL, my_worker_num, ptrans,
+ bucket_alloc, pthrd);
}
else {
ap_log_error(APLOG_MARK, APLOG_ERR, stat, ap_server_conf,
"apr_accept: (client socket)");
- clean_child_exit(1, my_worker_num, ptrans, bucket_alloc);
+ clean_child_exit(1, my_worker_num, ptrans, bucket_alloc, pthrd);
}
}
}
@@ -544,7 +551,7 @@
}
request_count++;
}
- clean_child_exit(0, my_worker_num, ptrans, bucket_alloc);
+ clean_child_exit(0, my_worker_num, ptrans, bucket_alloc, pthrd);
}