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