]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FSCORE-606 (Win) bridge fails because session read lock failure
authorJeff Lenk <jeff@jefflenk.com>
Thu, 20 May 2010 13:05:28 +0000 (08:05 -0500)
committerJeff Lenk <jeff@jefflenk.com>
Thu, 20 May 2010 13:05:28 +0000 (08:05 -0500)
libs/apr/include/arch/win32/apr_arch_thread_rwlock.h
libs/apr/locks/win32/thread_rwlock.c

index 1177e529103c6e8d4f0d195e2b34f887103874f9..0a6889df838a2a63a322eb7dc4f4e8d1c6b92411 100644 (file)
@@ -24,6 +24,7 @@ struct apr_thread_rwlock_t {
     HANDLE      write_mutex;
     HANDLE      read_event;
     LONG        readers;
+       CRITICAL_SECTION  read_section;
 };
 
 #endif  /* THREAD_RWLOCK_H */
index 7099509fb67855b161e365a8c93033d32027dfa9..4995ca2deee25eb429b7ca7060a991e29b0c00eb 100644 (file)
@@ -28,6 +28,8 @@ static apr_status_t thread_rwlock_cleanup(void *data)
     if (! CloseHandle(rwlock->read_event))
         return apr_get_os_error();
 
+       DeleteCriticalSection(&rwlock->read_section);
+
     if (! CloseHandle(rwlock->write_mutex))
         return apr_get_os_error();
     
@@ -53,6 +55,8 @@ APR_DECLARE(apr_status_t)apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock,
         return apr_get_os_error();
     }
 
+       InitializeCriticalSection(&(*rwlock)->read_section);
+
     apr_pool_cleanup_register(pool, *rwlock, thread_rwlock_cleanup,
                               apr_pool_cleanup_null);
 
@@ -62,10 +66,14 @@ APR_DECLARE(apr_status_t)apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock,
 static apr_status_t apr_thread_rwlock_rdlock_core(apr_thread_rwlock_t *rwlock,
                                                   DWORD  milliseconds)
 {
-    DWORD   code = WaitForSingleObject(rwlock->write_mutex, milliseconds);
+       DWORD   code;
+       EnterCriticalSection(&rwlock->read_section); 
+    code = WaitForSingleObject(rwlock->write_mutex, milliseconds);
 
-    if (code == WAIT_FAILED || code == WAIT_TIMEOUT)
+       if (code == WAIT_FAILED || code == WAIT_TIMEOUT) {
+               LeaveCriticalSection(&rwlock->read_section);
         return APR_FROM_OS_ERROR(code);
+       }
 
     /* We've successfully acquired the writer mutex, we can't be locked
      * for write, so it's OK to add the reader lock.  The writer mutex
@@ -73,12 +81,17 @@ static apr_status_t apr_thread_rwlock_rdlock_core(apr_thread_rwlock_t *rwlock,
      */
     InterlockedIncrement(&rwlock->readers);
     
-    if (! ResetEvent(rwlock->read_event))
+       if (! ResetEvent(rwlock->read_event)) {
+               LeaveCriticalSection(&rwlock->read_section);
         return apr_get_os_error();
+       }
     
-    if (! ReleaseMutex(rwlock->write_mutex))
+       if (! ReleaseMutex(rwlock->write_mutex)) {
+               LeaveCriticalSection(&rwlock->read_section);
         return apr_get_os_error();
-    
+       }
+
+       LeaveCriticalSection(&rwlock->read_section);
     return APR_SUCCESS;
 }