httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From stodd...@apache.org
Subject cvs commit: httpd-2.0/server/mpm/winnt child.c
Date Thu, 26 Aug 2004 00:53:39 GMT
stoddard    2004/08/25 17:53:39

  Modified:    .        Tag: APACHE_2_0_BRANCH CHANGES
               server/mpm/winnt Tag: APACHE_2_0_BRANCH child.c
  Log:
  Prevent Win32 pool corruption at startup
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.988.2.330 +1 -0      httpd-2.0/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/CHANGES,v
  retrieving revision 1.988.2.329
  retrieving revision 1.988.2.330
  diff -u -r1.988.2.329 -r1.988.2.330
  --- CHANGES	23 Aug 2004 15:18:53 -0000	1.988.2.329
  +++ CHANGES	26 Aug 2004 00:53:33 -0000	1.988.2.330
  @@ -1,4 +1,5 @@
   Changes with Apache 2.0.51
  +  *) Prevent Win32 pool corruption at startup [Allan Edwards]
   
     *) mod_ssl: Add "SSLUserName" directive to set r->user based on a
        chosen SSL environment variable.  PR 20957. 
  
  
  
  No                   revision
  No                   revision
  1.9.2.16  +16 -1     httpd-2.0/server/mpm/winnt/child.c
  
  Index: child.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/mpm/winnt/child.c,v
  retrieving revision 1.9.2.15
  retrieving revision 1.9.2.16
  diff -u -r1.9.2.15 -r1.9.2.16
  --- child.c	24 Mar 2004 20:28:49 -0000	1.9.2.15
  +++ child.c	26 Aug 2004 00:53:39 -0000	1.9.2.16
  @@ -58,7 +58,7 @@
   static unsigned int g_blocked_threads = 0;
   static HANDLE max_requests_per_child_event;
   
  -
  +static apr_thread_mutex_t  *child_lock;
   static apr_thread_mutex_t  *qlock;
   static PCOMP_CONTEXT qhead = NULL;
   static PCOMP_CONTEXT qtail = NULL;
  @@ -145,6 +145,7 @@
                    */
                   apr_allocator_t *allocator;
   
  +                apr_thread_mutex_lock(child_lock);
                   context = (PCOMP_CONTEXT) apr_pcalloc(pchild, sizeof(COMP_CONTEXT));
     
                   context->Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  @@ -152,6 +153,8 @@
                       /* Hopefully this is a temporary condition ... */
                       ap_log_error(APLOG_MARK,APLOG_WARNING, apr_get_os_error(), ap_server_conf,
                                    "mpm_get_completion_context: CreateEvent failed.");
  +
  +                    apr_thread_mutex_unlock(child_lock);
                       return NULL;
                   }
    
  @@ -163,6 +166,8 @@
                       ap_log_error(APLOG_MARK,APLOG_WARNING, rv, ap_server_conf,
                                    "mpm_get_completion_context: Failed to create the transaction
pool.");
                       CloseHandle(context->Overlapped.hEvent);
  +
  +                    apr_thread_mutex_unlock(child_lock);
                       return NULL;
                   }
                   apr_allocator_owner_set(allocator, context->ptrans);
  @@ -170,6 +175,8 @@
                   context->accept_socket = INVALID_SOCKET;
                   context->ba = apr_bucket_alloc_create(pchild);
                   apr_atomic_inc(&num_completion_contexts); 
  +
  +                apr_thread_mutex_unlock(child_lock);
                   break;
               }
           } else {
  @@ -408,6 +415,7 @@
       if (context == NULL) {
           /* allocate the completion context and the transaction pool */
           apr_allocator_t *allocator;
  +        apr_thread_mutex_lock(child_lock);
           context = apr_pcalloc(pchild, sizeof(COMP_CONTEXT));
           apr_allocator_create(&allocator);
           apr_allocator_max_free_set(allocator, ap_max_mem_free);
  @@ -415,6 +423,7 @@
           apr_allocator_owner_set(allocator, context->ptrans);
           apr_pool_tag(context->ptrans, "transaction");
           context->ba = apr_bucket_alloc_create(pchild);
  +        apr_thread_mutex_unlock(child_lock);
       }
       
       while (1) {
  @@ -875,6 +884,8 @@
       ap_log_error(APLOG_MARK,APLOG_NOTICE, APR_SUCCESS, ap_server_conf, 
                    "Child %d: Starting %d worker threads.", my_pid, ap_threads_per_child);
       child_handles = (HANDLE) apr_pcalloc(pchild, ap_threads_per_child * sizeof(int));
  +    apr_thread_mutex_create(&child_lock, APR_THREAD_MUTEX_DEFAULT, pchild);
  +
       while (1) {
           for (i = 0; i < ap_threads_per_child; i++) {
               int *score_idx;
  @@ -897,9 +908,11 @@
               /* Save the score board index in ht keyed to the thread handle. We need this

                * when cleaning up threads down below...
                */
  +            apr_thread_mutex_lock(child_lock);
               score_idx = apr_pcalloc(pchild, sizeof(int));
               *score_idx = i;
               apr_hash_set(ht, &child_handles[i], sizeof(HANDLE), score_idx);
  +            apr_thread_mutex_unlock(child_lock);
           }
           /* Start the listener only when workers are available */
           if (!listener_started && threads_created) {
  @@ -1082,6 +1095,8 @@
   
       CloseHandle(allowed_globals.jobsemaphore);
       apr_thread_mutex_destroy(allowed_globals.jobmutex);
  +    apr_thread_mutex_destroy(child_lock);
  +
       if (use_acceptex) {
           apr_thread_mutex_destroy(qlock);
           CloseHandle(qwait_event);
  
  
  

Mime
View raw message