#include "Internal.h" #include "Codemap.h" #include CgeSemaphore *CgeSemaphoreNew(int value, int *result) { CgeSemaphore *semaphore; int code = CGE_THREAD_EOOM; semaphore = malloc(sizeof(*semaphore)); if (semaphore) { semaphore->handle = CreateSemaphore(NULL, value, 0x7FFF, NULL); if (!semaphore->handle) { code = errorToErrorCode(GetLastError()); free(semaphore); semaphore = NULL; } } if (result) *result = code; return semaphore; } void CgeSemaphoreFree(CgeSemaphore *semaphore) { if (!semaphore) return; CloseHandle(semaphore->handle); free(semaphore); } int CgeSemaphorePost(CgeSemaphore *semaphore, int *result) { if (!ReleaseSemaphore(semaphore->handle, 1, NULL)) { if (result) *result = errorToErrorCode(GetLastError()); return 0; } return 1; } int CgeSemaphoreWait(CgeSemaphore *semaphore, int *result) { return CgeSemaphoreWaitFor(semaphore, INFINITE, result); } int CgeSemaphoreTryWait(CgeSemaphore *semaphore, int *result) { return CgeSemaphoreWaitFor(semaphore, 0, result); } int CgeSemaphoreWaitFor(CgeSemaphore *semaphore, uint32_t timeout, int *result) { switch (WaitForSingleObject(semaphore->handle, timeout)) { case 0: return 1; case WAIT_TIMEOUT: if (result) *result = CGE_THREAD_ETIMEDOUT; return 0; default: if (result) *result = CGE_THREAD_EUNKNOWN; return 0; } }