Commit 75fc82c9 authored by Aric Cyr's avatar Aric Cyr Committed by Alexandre Julliard

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.
parent c04cbbfe
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment