From 825b61374c29b529fce76f5a26198c30fa229b3c Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Sun, 2 Nov 2025 15:46:50 -0500 Subject: Add semaphore wrapper --- src/lib/core/CMakeLists.txt | 1 + src/lib/core/include/sem.h | 17 +++++++++++++++++ src/lib/core/semaphore.c | 26 ++++++++++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 src/lib/core/include/sem.h create mode 100644 src/lib/core/semaphore.c diff --git a/src/lib/core/CMakeLists.txt b/src/lib/core/CMakeLists.txt index e3e3d4b..7b33cf9 100644 --- a/src/lib/core/CMakeLists.txt +++ b/src/lib/core/CMakeLists.txt @@ -21,6 +21,7 @@ add_library(stasis_core STATIC template_func_proto.c envctl.c multiprocessing.c + semaphore.c ) target_include_directories(stasis_core PRIVATE ${core_INCLUDE} diff --git a/src/lib/core/include/sem.h b/src/lib/core/include/sem.h new file mode 100644 index 0000000..868f33d --- /dev/null +++ b/src/lib/core/include/sem.h @@ -0,0 +1,17 @@ +#ifndef STASIS_SEMAPHORE_H +#define STASIS_SEMAPHORE_H + +#include + +struct Semaphore { + sem_t *sem; + char name[255]; +}; + +int semaphore_init(struct Semaphore *s, const char *name, int value); +int semaphore_wait(struct Semaphore *s); +int semaphore_post(struct Semaphore *s); + +void semaphore_destroy(struct Semaphore *s); + +#endif //STASIS_SEMAPHORE_H \ No newline at end of file diff --git a/src/lib/core/semaphore.c b/src/lib/core/semaphore.c new file mode 100644 index 0000000..9ea4c9c --- /dev/null +++ b/src/lib/core/semaphore.c @@ -0,0 +1,26 @@ +#include +#include +#include "sem.h" + +int semaphore_init(struct Semaphore *s, const char *name, const int value) { + snprintf(s->name, sizeof(s->name), "/%s", name); + s->sem = sem_open(s->name, O_CREAT, 0644, value); + if (s->sem == SEM_FAILED) { + perror("sem_open"); + return -1; + } + return 0; +} + +int semaphore_wait(struct Semaphore *s) { + return sem_wait(s->sem); +} + +int semaphore_post(struct Semaphore *s) { + return sem_post(s->sem); +} + +void semaphore_destroy(struct Semaphore *s) { + sem_close(s->sem); + sem_unlink(s->name); +} -- cgit