56 lines
1.5 KiB
C
56 lines
1.5 KiB
C
#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;
|
|
}
|
|
}
|