aboutsummaryrefslogtreecommitdiff
path: root/task.c
diff options
context:
space:
mode:
authorPaul Selkirk <paul@psgd.org>2018-04-19 16:30:22 -0400
committerPaul Selkirk <paul@psgd.org>2018-04-19 18:50:32 -0400
commit0f55f31aaa35357b87e7ff817e2683ba1a277193 (patch)
tree6cf51d2ac832bea1809b7e479b497949a2279ae9 /task.c
parentaf127e807008b2153d597e756ff26da69daf9e45 (diff)
Reconstruct the hashsig hash tree(s) on device restart.
This can take long enough (several minutes for h=10) that we do it in a background task, which is then converted to an RPC dispatch task. Also add a very limited form of free(), to free the topmost allocation in the sdram "heap". I don't want to deal with real heap management, but I do want to be able to recover memory upon deleting a hashsig key, if it's easy to do so.
Diffstat (limited to 'task.c')
-rw-r--r--task.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/task.c b/task.c
index 36e8580..34daa24 100644
--- a/task.c
+++ b/task.c
@@ -131,6 +131,24 @@ tcb_t *task_add(char *name, funcp_t func, void *cookie, void *stack, size_t stac
return t;
}
+/* Reinitalize the current task.
+ * NOTE: This will destroy any state in the running task.
+ * DO NOT CALL THIS UNLESS YOU ARE REALLY SURE THAT'S WHAT YOU WANT TO DO.
+ */
+void task_mod(char *name, funcp_t func, void *cookie)
+{
+ tcb_t *t = cur_task;
+ t->name = name;
+ t->func = func;
+ t->cookie = cookie;
+ t->state = TASK_INIT;
+ t->stack_ptr = t->stack_base + t->stack_len;
+ for (uint32_t *p = (uint32_t *)t->stack_base; p < (uint32_t *)t->stack_ptr; ++p)
+ *p = STACK_GUARD_WORD;
+ __set_MSP((uint32_t)cur_task->stack_ptr);
+ task_yield();
+}
+
/* Set the idle hook function pointer.
*
* This function is called repeatedly when the system is idle (there are
@@ -232,11 +250,11 @@ void task_yield(void)
/* If there are no other runnable tasks (and cur_task is runnable),
* we don't need to context-switch.
*/
- if (next == cur_task)
+ if (next == cur_task && cur_task->state != TASK_INIT)
return;
/* Save current context, if there is one. */
- if (cur_task != NULL) {
+ if (cur_task != NULL && cur_task->state != TASK_INIT) {
__asm("push {r0-r12, lr}");
cur_task->stack_ptr = (void *)__get_MSP();