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 2002/05/22 00:00:45 UTC
cvs commit: httpd-2.0/server/mpm/netware mpm_netware.c
bnicholes 02/05/21 15:00:45
Modified: server/mpm/netware mpm_netware.c
Log:
Fixing a memory leak with the threads bucket_allocator. We were allocating
too much and not freeing up enough. On a thread exit the bucket and the
transaction pool need to be cleaned up. When the MPM exits, the main pool
needs to be cleaned up.
Revision Changes Path
1.51 +13 -12 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.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- mpm_netware.c 17 May 2002 11:11:39 -0000 1.50
+++ mpm_netware.c 21 May 2002 22:00:44 -0000 1.51
@@ -204,9 +204,12 @@
#endif
/* a clean exit from a child with proper cleanup */
-static void clean_child_exit(int code, int worker_num) __attribute__ ((noreturn));
-static void clean_child_exit(int code, int worker_num)
+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)
{
+ apr_bucket_alloc_destroy(bucket_alloc);
+ apr_pool_destroy(ptrans);
+
apr_thread_mutex_lock(worker_thread_count_mutex);
worker_thread_count--;
apr_thread_mutex_unlock(worker_thread_count_mutex);
@@ -377,11 +380,7 @@
apr_allocator_set_owner(allocator, ptrans);
apr_pool_tag(ptrans, "transaction");
- apr_allocator_create(&allocator);
- apr_pool_create_ex(&pbucket, NULL, NULL, allocator);
- apr_allocator_set_owner(allocator, pbucket);
- apr_pool_tag(pbucket, "bucket_allocs");
- bucket_alloc = apr_bucket_alloc_create(pbucket);
+ bucket_alloc = apr_bucket_alloc_create(pmain);
apr_thread_mutex_lock(worker_thread_count_mutex);
worker_thread_count++;
@@ -399,7 +398,7 @@
if ((ap_max_requests_per_child > 0
&& requests_this_child++ >= ap_max_requests_per_child)) {
- clean_child_exit(0, my_worker_num);
+ clean_child_exit(0, my_worker_num, ptrans, bucket_alloc);
}
ap_update_child_status_from_indexes(0, my_worker_num, WORKER_READY,
@@ -416,7 +415,7 @@
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);
apr_thread_mutex_unlock(accept_mutex);
- clean_child_exit(0, my_worker_num);
+ clean_child_exit(0, my_worker_num, ptrans, bucket_alloc);
}
/* If we just satisfied a request on listen port x, assume that more
@@ -522,13 +521,13 @@
ap_log_error(APLOG_MARK, APLOG_EMERG, stat, ap_server_conf,
"apr_accept: giving up.");
apr_thread_mutex_unlock(accept_mutex);
- clean_child_exit(APEXIT_CHILDFATAL, my_worker_num);
+ clean_child_exit(APEXIT_CHILDFATAL, my_worker_num, ptrans, bucket_alloc);
default:
ap_log_error(APLOG_MARK, APLOG_ERR, stat, ap_server_conf,
"apr_accept: (client socket)");
apr_thread_mutex_unlock(accept_mutex);
- clean_child_exit(1, my_worker_num);
+ clean_child_exit(1, my_worker_num, ptrans, bucket_alloc);
}
}
}
@@ -550,7 +549,7 @@
}
request_count++;
}
- clean_child_exit(0, my_worker_num);
+ clean_child_exit(0, my_worker_num, ptrans, bucket_alloc);
}
@@ -954,6 +953,7 @@
while (worker_thread_count > 0)
apr_thread_yield();
+ apr_pool_destroy (pmain);
return 1;
}
else { /* the only other way out is a restart */
@@ -973,6 +973,7 @@
apr_thread_yield();
}
DBPRINT0 ("restarting...\n");
+ apr_pool_destroy (pmain);
}
return 0;