This commit is contained in:
55
win32/Semaphore.c
Normal file
55
win32/Semaphore.c
Normal file
@@ -0,0 +1,55 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user