Aric Cyr : dplayx: Fix semaphore deadlock.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Mar 15 05:11:55 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 75fc82c965611d8f71f93131008771f2252d18fe
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=75fc82c965611d8f71f93131008771f2252d18fe

Author: Aric Cyr <aric.cyr at gmail.com>
Date:   Sat Mar  4 03:43:04 2006 +0900

dplayx: Fix semaphore deadlock.

- Make sure to release the dplayx semaphore in for error cases as well.
- Prevent race condition between creation of the semaphore and
  grabbing of the lock by creating the semaphore in the locked state
  instead of unlocked.

---

 dlls/dplayx/dplayx_global.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/dlls/dplayx/dplayx_global.c b/dlls/dplayx/dplayx_global.c
index 5255f71..723b7e5 100644
--- a/dlls/dplayx/dplayx_global.c
+++ b/dlls/dplayx/dplayx_global.c
@@ -229,7 +229,7 @@ BOOL DPLAYX_ConstructData(void)
   s_attrib.lpSecurityDescriptor = NULL;
   s_attrib.nLength              = sizeof(s_attrib);
 
-  hDplayxSema = CreateSemaphoreA( &s_attrib, 1, 1, lpszDplayxSemaName );
+  hDplayxSema = CreateSemaphoreA( &s_attrib, 0, 1, lpszDplayxSemaName );
 
   /* First instance creates the semaphore. Others just use it */
   if( GetLastError() == ERROR_SUCCESS )
@@ -242,6 +242,7 @@ BOOL DPLAYX_ConstructData(void)
   else if ( GetLastError() == ERROR_ALREADY_EXISTS )
   {
     TRACE( "Found semaphore handle %p\n", hDplayxSema );
+    DPLAYX_AquireSemaphore();
   }
   else
   {
@@ -251,8 +252,6 @@ BOOL DPLAYX_ConstructData(void)
 
   SetLastError( ERROR_SUCCESS );
 
-  DPLAYX_AquireSemaphore();
-
   hDplayxSharedMem = CreateFileMappingA( INVALID_HANDLE_VALUE,
                                          &s_attrib,
                                          PAGE_READWRITE | SEC_COMMIT,
@@ -271,6 +270,7 @@ BOOL DPLAYX_ConstructData(void)
   else
   {
     ERR( ": unable to create shared memory (%ld)\n", GetLastError() );
+    DPLAYX_ReleaseSemaphore();
     return FALSE;
   }
 
@@ -282,6 +282,7 @@ BOOL DPLAYX_ConstructData(void)
   {
     ERR( ": unable to map static data into process memory space (%ld)\n",
          GetLastError() );
+    DPLAYX_ReleaseSemaphore();
     return FALSE;
   }
   else




More information about the wine-cvs mailing list