static os_result condSignal( os_cond *cond, long mask) { char name[OS_SERVICE_ENTITY_NAME_MAX]; HANDLE hQueue; DWORD result; long oldState; os_result osr; assert(cond != NULL); osr = os_resultSuccess; if (cond->scope == OS_SCOPE_SHARED) { _snprintf(name, sizeof(name), "%s%s%d%d", (os_sharedMemIsGlobal() ? OS_SERVICE_GLOBAL_NAME_PREFIX : ""), OS_SERVICE_SEM_NAME_PREFIX, cond->qId, os_getShmBaseAddressFromPointer(cond)); hQueue = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, name); if (hQueue == NULL) { OS_DEBUG_1("condSignal", "OpenSemaphore failed %d", (int)GetLastError()); assert(0); return os_resultFail; } } else { hQueue = (HANDLE)cond->qId; } oldState = InterlockedOr(&cond->state, mask); if (oldState == 0) { /* no waiters */ InterlockedAnd(&cond->state, ~mask); return osr; } if (mask == BROADCAST_BIT_MASK) { result = ReleaseSemaphore(hQueue, oldState, 0); } else { result = ReleaseSemaphore(hQueue, 1, 0); } InterlockedAnd(&cond->state, ~mask); if (cond->scope == OS_SCOPE_SHARED) { CloseHandle(hQueue); } return osr; }
static HANDLE createNewHandle (os_cond * cond) { HANDLE result = NULL; char name[OS_SERVICE_ENTITY_NAME_MAX]; wchar_t* wStringName; _snprintf(name, sizeof(name), "%s%d%d", OS_SERVICE_SEM_NAME_PREFIX, cond->qId, os_getShmBaseAddressFromPointer(cond)); wStringName = wce_mbtowc(name); result = CreateSemaphore(NULL, 0, 0x7fffffff, wStringName); os_free (wStringName); return result; }
static os_result condTimedWait( os_cond *cond, os_mutex *mutex, DWORD timeout) { HANDLE hQueue; HANDLE hMtx; char name[OS_SERVICE_ENTITY_NAME_MAX]; DWORD wsr; LONG c; LONG lockCount; os_result osr; os_result result; assert(cond != NULL); assert(mutex != NULL); result = os_resultSuccess; if (cond->scope == OS_SCOPE_SHARED) { _snprintf(name, sizeof(name), "%s%s%d%d", (os_sharedMemIsGlobal() ? OS_SERVICE_GLOBAL_NAME_PREFIX : ""), OS_SERVICE_SEM_NAME_PREFIX, cond->qId, os_getShmBaseAddressFromPointer(cond)); hQueue = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, name); if (hQueue == NULL) { OS_DEBUG_1("condTimedWait", "OpenSemaphore failed %d", (int)GetLastError()); assert(0); return os_resultFail; } _snprintf(name, sizeof(name), "%s%s%d%d", (os_sharedMemIsGlobal() ? OS_SERVICE_GLOBAL_NAME_PREFIX : ""), OS_SERVICE_EVENT_NAME_PREFIX, mutex->id, os_getShmBaseAddressFromPointer(cond)); hMtx = OpenEvent(EVENT_ALL_ACCESS, FALSE, name); if (hMtx == NULL) { OS_DEBUG_1("condTimedWait", "OpenEvent failed %d", (int)GetLastError()); CloseHandle(hQueue); assert(0); return os_resultFail; } } else { hQueue = (HANDLE)cond->qId; hMtx = (HANDLE)mutex->id; } InterlockedIncrement(&cond->state); lockCount = InterlockedDecrement(&mutex->lockCount); if (lockCount > 0) { wsr = SignalObjectAndWait(hMtx, hQueue, timeout, FALSE); } else { wsr = WaitForSingleObject(hQueue, timeout); } assert((wsr == WAIT_OBJECT_0) || (wsr == WAIT_FAILED) || (wsr == WAIT_ABANDONED) || (wsr == WAIT_TIMEOUT)); if (wsr == WAIT_TIMEOUT) { result = os_resultTimeout; } else if (wsr != WAIT_OBJECT_0) { result = os_resultFail; } c = InterlockedDecrement(&cond->state); osr = os_mutexLock(mutex); if (osr != os_resultSuccess) { result = osr; } if (cond->scope == OS_SCOPE_SHARED) { CloseHandle(hQueue); CloseHandle(hMtx); } return result; }