Files
2025-01-29 10:55:49 +01:00

57 lines
1.5 KiB
C

#include <kinc/system.h>
#include <kinc/threads/semaphore.h>
#ifdef __APPLE__
void kinc_semaphore_init(kinc_semaphore_t *semaphore, int current, int max) {
semaphore->impl.semaphore = dispatch_semaphore_create(current);
}
void kinc_semaphore_destroy(kinc_semaphore_t *semaphore) {}
void kinc_semaphore_release(kinc_semaphore_t *semaphore, int count) {
for (int i = 0; i < count; ++i) {
dispatch_semaphore_signal(semaphore->impl.semaphore);
}
}
void kinc_semaphore_acquire(kinc_semaphore_t *semaphore) {
dispatch_semaphore_wait(semaphore->impl.semaphore, DISPATCH_TIME_FOREVER);
}
bool kinc_semaphore_try_to_acquire(kinc_semaphore_t *semaphore, double seconds) {
return dispatch_semaphore_wait(semaphore->impl.semaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(seconds * 1000 * 1000 * 1000))) == 0;
}
#else
void kinc_semaphore_init(kinc_semaphore_t *semaphore, int current, int max) {
sem_init(&semaphore->impl.semaphore, 0, current);
}
void kinc_semaphore_destroy(kinc_semaphore_t *semaphore) {
sem_destroy(&semaphore->impl.semaphore);
}
void kinc_semaphore_release(kinc_semaphore_t *semaphore, int count) {
for (int i = 0; i < count; ++i) {
sem_post(&semaphore->impl.semaphore);
}
}
void kinc_semaphore_acquire(kinc_semaphore_t *semaphore) {
sem_wait(&semaphore->impl.semaphore);
}
bool kinc_semaphore_try_to_acquire(kinc_semaphore_t *semaphore, double seconds) {
double now = kinc_time();
do {
if (sem_trywait(&semaphore->impl.semaphore) == 0) {
return true;
}
} while (kinc_time() < now + seconds);
return false;
}
#endif