You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by wr...@apache.org on 2002/10/29 23:54:23 UTC

cvs commit: apr/locks/unix global_mutex.c

wrowe       2002/10/29 14:54:23

  Modified:    locks/unix global_mutex.c
  Log:
    Whoa Nelly!  Lots of errors in the global mutex failure cases.  We have
    to unlock the outer lock when the inner lock fails!!!  Many deadlock
    situations existed prior to this patch.
  
  Revision  Changes    Path
  1.8       +32 -17    apr/locks/unix/global_mutex.c
  
  Index: global_mutex.c
  ===================================================================
  RCS file: /home/cvs/apr/locks/unix/global_mutex.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- global_mutex.c	8 May 2002 13:30:11 -0000	1.7
  +++ global_mutex.c	29 Oct 2002 22:54:22 -0000	1.8
  @@ -64,19 +64,20 @@
       apr_global_mutex_t *m = (apr_global_mutex_t *)data;
       apr_status_t rv;
   
  +    rv = apr_proc_mutex_destroy(m->proc_mutex);
  +
   #if APR_HAS_THREADS
       if (m->thread_mutex) {
  -        rv = apr_thread_mutex_destroy(m->thread_mutex);
           if (rv != APR_SUCCESS) {
  -            return rv;
  +            (void)apr_thread_mutex_destroy(m->thread_mutex);
  +        }
  +        else {
  +            rv = apr_thread_mutex_destroy(m->thread_mutex);
           }
       }
   #endif /* APR_HAS_THREADS */
  -    rv = apr_proc_mutex_destroy(m->proc_mutex);
  -    if (rv != APR_SUCCESS) {
  -       return rv;
  -    }
  -    return APR_SUCCESS;
  +
  +    return rv;
   }
   
   APR_DECLARE(apr_status_t) apr_global_mutex_create(apr_global_mutex_t **mutex,
  @@ -103,6 +104,7 @@
           rv = apr_thread_mutex_create(&m->thread_mutex,
                                        APR_THREAD_MUTEX_DEFAULT, m->pool);
           if (rv != APR_SUCCESS) {
  +            rv = apr_proc_mutex_destroy(m->proc_mutex);
               return rv;
           }
       }
  @@ -134,11 +136,18 @@
           }
       }
   #endif /* APR_HAS_THREADS */
  +
       rv = apr_proc_mutex_lock(mutex->proc_mutex);
  +
  +#if APR_HAS_THREADS
       if (rv != APR_SUCCESS) {
  -        return rv;
  +        if (mutex->thread_mutex) {
  +            (void)apr_thread_mutex_unlock(mutex->thread_mutex);
  +        }
       }
  -    return APR_SUCCESS;
  +#endif /* APR_HAS_THREADS */
  +
  +    return rv;
   }
   
   APR_DECLARE(apr_status_t) apr_global_mutex_trylock(apr_global_mutex_t *mutex)
  @@ -153,11 +162,18 @@
           }
       }
   #endif /* APR_HAS_THREADS */
  +
       rv = apr_proc_mutex_trylock(mutex->proc_mutex);
  +
  +#if APR_HAS_THREADS
       if (rv != APR_SUCCESS) {
  -        return rv;
  +        if (mutex->thread_mutex) {
  +            (void)apr_thread_mutex_unlock(mutex->thread_mutex);
  +        }
       }
  -    return APR_SUCCESS;
  +#endif /* APR_HAS_THREADS */
  +
  +    return rv;
   }
   
   APR_DECLARE(apr_status_t) apr_global_mutex_unlock(apr_global_mutex_t *mutex)
  @@ -165,18 +181,17 @@
       apr_status_t rv;
   
       rv = apr_proc_mutex_unlock(mutex->proc_mutex);
  -    if (rv != APR_SUCCESS) {
  -        return rv;
  -    }
   #if APR_HAS_THREADS
       if (mutex->thread_mutex) {
  -        rv = apr_thread_mutex_unlock(mutex->thread_mutex);
           if (rv != APR_SUCCESS) {
  -            return rv;
  +            (void)apr_thread_mutex_unlock(mutex->thread_mutex);
  +        }
  +        else {
  +            rv = apr_thread_mutex_unlock(mutex->thread_mutex);
           }
       }
   #endif /* APR_HAS_THREADS */
  -    return APR_SUCCESS;
  +    return rv;
   }
   
   APR_DECLARE(apr_status_t) apr_os_global_mutex_get(apr_os_global_mutex_t *ospmutex,