45 lines
1000 B
C
45 lines
1000 B
C
#include "tinycsem.h"
|
|
|
|
bool tinycsem_init(struct tinycsem *sem, int count, int max)
|
|
{
|
|
#ifdef _WIN32
|
|
SECURITY_ATTRIBUTES *attr = NULL; // Default
|
|
const char *name = NULL; // No name
|
|
HANDLE handle = CreateSemaphore(attr, count, max, name);
|
|
if (handle == NULL)
|
|
return false;
|
|
sem->data = handle;
|
|
return true;
|
|
#else
|
|
(void) max; // POSIX doesn't use this
|
|
return sem_init(&sem->data, 0, count) == 0;
|
|
#endif
|
|
}
|
|
|
|
bool tinycsem_free(struct tinycsem *sem)
|
|
{
|
|
#ifdef _WIN32
|
|
CloseHandle(sem->data);
|
|
return true;
|
|
#else
|
|
return sem_destroy(&sem->data) == 0;
|
|
#endif
|
|
}
|
|
|
|
bool tinycsem_wait(struct tinycsem *sem)
|
|
{
|
|
#ifdef _WIN32
|
|
return WaitForSingleObject(sem->data, INFINITE) == WAIT_OBJECT_0;
|
|
#else
|
|
return sem_wait(&sem->data) == 0;
|
|
#endif
|
|
}
|
|
|
|
bool tinycsem_signal(struct tinycsem *sem)
|
|
{
|
|
#ifdef _WIN32
|
|
return ReleaseSemaphore(sem->data, 1, NULL);
|
|
#else
|
|
return sem_post(&sem->data) == 0;
|
|
#endif
|
|
} |