aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2025-11-02 15:46:50 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2025-11-02 15:46:50 -0500
commit825b61374c29b529fce76f5a26198c30fa229b3c (patch)
treec073655bbd1532b2e286543611808a43cb686a79 /src
parentd90493618ce34a732c5411d1670be57d4dd9db4e (diff)
downloadstasis-825b61374c29b529fce76f5a26198c30fa229b3c.tar.gz
Add semaphore wrapper
Diffstat (limited to 'src')
-rw-r--r--src/lib/core/CMakeLists.txt1
-rw-r--r--src/lib/core/include/sem.h17
-rw-r--r--src/lib/core/semaphore.c26
3 files changed, 44 insertions, 0 deletions
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 <semaphore.h>
+
+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 <stdio.h>
+#include <fcntl.h>
+#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);
+}