Files
CgeThread/win32/Semaphore.c

56 lines
1.5 KiB
C
Raw Permalink Normal View History

2026-08-09 12:55:16 +03:00
#include "Internal.h"
#include "Codemap.h"
#include <stdlib.h>
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;
}
}