aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Selkirk <paul@psgd.org>2017-04-29 23:24:37 -0400
committerPaul Selkirk <paul@psgd.org>2017-04-29 23:24:37 -0400
commit73b784eac101085b8734d2188ae59b5295a80839 (patch)
treebe0fc88813aaf5c7c8198e2ab35caa7748897a02
parente0e97a5217bbb2a198d23ac632de97b4ebe0e44a (diff)
Add minimal mutexes to the minimal tasking system
-rw-r--r--projects/hsm/hsm.c6
-rw-r--r--task.c13
-rw-r--r--task.h5
3 files changed, 24 insertions, 0 deletions
diff --git a/projects/hsm/hsm.c b/projects/hsm/hsm.c
index a683b7f..60fa2bd 100644
--- a/projects/hsm/hsm.c
+++ b/projects/hsm/hsm.c
@@ -380,6 +380,12 @@ void hal_task_yield(void)
task_yield();
}
+/* A mutex to arbitrate concurrent access to the keystore.
+ */
+task_mutex_t ks_mutex = { 0 };
+void hal_ks_lock(void) { task_mutex_lock(&ks_mutex); }
+void hal_ks_unlock(void) { task_mutex_unlock(&ks_mutex); }
+
/* The main task. This does all the setup, and the worker tasks handle
* the rest.
*/
diff --git a/task.c b/task.c
index 600b679..bc6eded 100644
--- a/task.c
+++ b/task.c
@@ -326,3 +326,16 @@ void task_delay(uint32_t delay)
while ((HAL_GetTick() - tickstart) < delay)
task_yield();
}
+
+void task_mutex_lock(task_mutex_t *mutex)
+{
+ while (mutex->locked)
+ task_yield();
+ mutex->locked = 1;
+}
+
+void task_mutex_unlock(task_mutex_t *mutex)
+{
+ if (mutex != NULL)
+ mutex->locked = 0;
+}
diff --git a/task.h b/task.h
index 9178c2d..f4d4260 100644
--- a/task.h
+++ b/task.h
@@ -45,6 +45,8 @@ typedef enum task_state {
typedef struct task_cb tcb_t;
+typedef struct { unsigned locked; } task_mutex_t;
+
typedef void (*funcp_t)(void);
extern tcb_t *task_add(char *name, funcp_t func, void *cookie, void *stack, size_t stack_len);
@@ -67,4 +69,7 @@ extern tcb_t *task_iterate(tcb_t *t);
extern void task_delay(uint32_t delay);
+extern void task_mutex_lock(task_mutex_t *mutex);
+extern void task_mutex_unlock(task_mutex_t *mutex);
+
#endif /* _TASK_H_ */