Initial commit
Some checks failed
CI / build-and-analyze (push) Failing after 1m18s

This commit is contained in:
2026-08-09 12:55:16 +03:00
commit 04e02490b7
25 changed files with 1293 additions and 0 deletions

55
win32/Semaphore.c Normal file
View 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;
}
}