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;