PAL_ERROR CorUnix::InternalReleaseMutex( CPalThread *pthr, HANDLE hMutex ) { PAL_ERROR palError = NO_ERROR; IPalObject *pobjMutex = NULL; ISynchStateController *pssc = NULL; PalObjectTypeId objectTypeId; _ASSERTE(NULL != pthr); ENTRY("InternalReleaseMutex(pthr=%p, hMutex=%p)\n", pthr, hMutex ); palError = g_pObjectManager->ReferenceObjectByHandle( pthr, hMutex, &aotAnyMutex, 0, // should be MUTEX_MODIFY_STATE -- current ignored (no Win32 security) &pobjMutex ); if (NO_ERROR != palError) { ERROR("Unable to obtain object for handle %p (error %d)!\n", hMutex, palError); goto InternalReleaseMutexExit; } objectTypeId = pobjMutex->GetObjectType()->GetId(); if (objectTypeId == otiMutex) { palError = pobjMutex->GetSynchStateController( pthr, &pssc ); if (NO_ERROR != palError) { ASSERT("Error %d obtaining synch state controller\n", palError); goto InternalReleaseMutexExit; } palError = pssc->DecrementOwnershipCount(); if (NO_ERROR != palError) { ERROR("Error %d decrementing mutex ownership count\n", palError); goto InternalReleaseMutexExit; } } else { _ASSERTE(objectTypeId == otiNamedMutex); SharedMemoryProcessDataHeader *processDataHeader = SharedMemoryProcessDataHeader::PalObject_GetProcessDataHeader(pobjMutex); _ASSERTE(processDataHeader != nullptr); try { static_cast<NamedMutexProcessData *>(processDataHeader->GetData())->ReleaseLock(); } catch (SharedMemoryException ex) { palError = ex.GetErrorCode(); goto InternalReleaseMutexExit; } } InternalReleaseMutexExit: if (NULL != pssc) { pssc->ReleaseController(); } if (NULL != pobjMutex) { pobjMutex->ReleaseReference(pthr); } LOGEXIT("InternalReleaseMutex returns %i\n", palError); return palError; }
PAL_ERROR CorUnix::InternalReleaseMutex( CPalThread *pthr, HANDLE hMutex ) { PAL_ERROR palError = NO_ERROR; IPalObject *pobjMutex = NULL; ISynchStateController *pssc = NULL; _ASSERTE(NULL != pthr); ENTRY("InternalReleaseMutex(pthr=%p, hMutex=%p)\n", pthr, hMutex ); palError = g_pObjectManager->ReferenceObjectByHandle( pthr, hMutex, &aotMutex, 0, // should be MUTEX_MODIFY_STATE -- current ignored (no Win32 security) &pobjMutex ); if (NO_ERROR != palError) { ERROR("Unable to obtain object for handle %p (error %d)!\n", hMutex, palError); goto InternalReleaseMutexExit; } palError = pobjMutex->GetSynchStateController( pthr, &pssc ); if (NO_ERROR != palError) { ASSERT("Error %d obtaining synch state controller\n", palError); goto InternalReleaseMutexExit; } palError = pssc->DecrementOwnershipCount(); if (NO_ERROR != palError) { ERROR("Error %d decrementing mutex ownership count\n", palError); goto InternalReleaseMutexExit; } InternalReleaseMutexExit: if (NULL != pssc) { pssc->ReleaseController(); } if (NULL != pobjMutex) { pobjMutex->ReleaseReference(pthr); } LOGEXIT("InternalReleaseMutex returns %i\n", palError); return palError; }