From 5acd350c2c9ed137bd50059278b37dadc28ef9ec Mon Sep 17 00:00:00 2001
From: Bah Thierno-Souleymane <thiernosouleymane.bah.etu@univ-lille.fr>
Date: Tue, 20 Apr 2021 02:37:11 +0200
Subject: [PATCH] feat(semanphore implementation done)

---
 include/sem.h | 19 +++++++++++++++++++
 src/sem.c     | 44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+)
 create mode 100644 include/sem.h
 create mode 100644 src/sem.c

diff --git a/include/sem.h b/include/sem.h
new file mode 100644
index 0000000..16d176d
--- /dev/null
+++ b/include/sem.h
@@ -0,0 +1,19 @@
+#if !defined(SEM_H)
+#define SEM_H
+
+#include "context.h"
+
+#define SEM_MAGIC 0xCAFEBABE
+
+typedef struct sem_s
+{
+    int cpt;
+    ctx_t *first_ctx;
+    int magic;
+} sem_t;
+
+int sem_init(sem_t *sem, int val);
+void sem_up(sem_t *sem);
+void sem_down(sem_t *sem);
+
+#endif
diff --git a/src/sem.c b/src/sem.c
new file mode 100644
index 0000000..061caf4
--- /dev/null
+++ b/src/sem.c
@@ -0,0 +1,44 @@
+#include "sem.h"
+#include "context.h"
+#include "utils.h"
+
+extern ctx_t *current_ctx;
+
+int sem_init(sem_t *sem, int val)
+{
+    assert(sem->magic != SEM_MAGIC);
+
+    sem->magic = SEM_MAGIC;
+    sem->cpt = val;
+    sem->first_ctx = NULL;
+
+    return 0;
+}
+
+void sem_up(sem_t *sem)
+{
+    assert(sem->magic == SEM_MAGIC);
+
+    irq_disable();
+    if ((++sem->cpt) <= 0)
+    {
+        sem->first_ctx->status = CTX_EXEC;
+        sem->first_ctx = sem->first_ctx->sem_next_ctx;
+    }
+    irq_enable();
+}
+
+void sem_down(sem_t *sem)
+{
+    assert(sem->magic == SEM_MAGIC);
+
+    irq_disable();
+    if ((++sem->cpt) < 0)
+    {
+        current_ctx->status = CTX_WAIT;
+        current_ctx->sem_next_ctx = sem->first_ctx;
+        sem->first_ctx = current_ctx;
+        yield();
+    }
+    irq_enable();
+}
-- 
GitLab