diff options
-rw-r--r-- | projects/hsm/hsm.c | 6 | ||||
-rw-r--r-- | task.c | 13 | ||||
-rw-r--r-- | task.h | 5 |
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. */ @@ -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; +} @@ -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_ */ |