summaryrefslogtreecommitdiff
path: root/libddekit/semaphore.c
diff options
context:
space:
mode:
Diffstat (limited to 'libddekit/semaphore.c')
-rw-r--r--libddekit/semaphore.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/libddekit/semaphore.c b/libddekit/semaphore.c
new file mode 100644
index 00000000..6fbb7f35
--- /dev/null
+++ b/libddekit/semaphore.c
@@ -0,0 +1,48 @@
+#include <l4/dde/ddekit/semaphore.h>
+#include <l4/dde/ddekit/memory.h>
+
+#include <l4/semaphore/semaphore.h>
+
+struct ddekit_sem {
+ l4semaphore_t sem;
+};
+
+ddekit_sem_t *ddekit_sem_init(int value) {
+ ddekit_sem_t *sem;
+
+ sem = (ddekit_sem_t *) ddekit_simple_malloc(sizeof(*sem));
+ sem->sem = L4SEMAPHORE_INIT(value);
+
+ return sem;
+}
+
+void ddekit_sem_deinit(ddekit_sem_t *sem) {
+ ddekit_simple_free(sem);
+}
+
+void ddekit_sem_down(ddekit_sem_t *sem) {
+#if 0
+ printf("%s:%d sem=%p l4sem=0x%08x\n", __FILE__, __LINE__, sem, sem->sem);
+ enter_kdebug("");
+#endif
+ l4semaphore_down(&sem->sem);
+/*printf("%s:%d\n", __FILE__, __LINE__); */
+}
+
+/* returns 0 on success, != 0 when it would block */
+int ddekit_sem_down_try(ddekit_sem_t *sem) {
+ return l4semaphore_try_down(&sem->sem) ? 0 : 1;
+}
+
+/* returns 0 on success, != 0 on timeout */
+int ddekit_sem_down_timed(ddekit_sem_t *sem, int timo) {
+ return l4semaphore_down_timed(&sem->sem, timo);
+}
+
+void ddekit_sem_up(ddekit_sem_t *sem) {
+#if 0
+ printf("%s:%d sem=%p l4sem=0x%08x\n", __FILE__, __LINE__, sem, sem->sem);
+#endif
+ l4semaphore_up(&sem->sem);
+}
+