From 2dc8eac296f5f8f5388bc98188efe7ff6bf8c9ff Mon Sep 17 00:00:00 2001 From: Alec Murphy Date: Fri, 28 Mar 2025 10:31:06 -0400 Subject: [PATCH] System/Setup/Environment: Don't deadlock on spawning multicore tasks simultaneously --- System/Setup/Environment.HC | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/System/Setup/Environment.HC b/System/Setup/Environment.HC index 8aedb9c..46b8efd 100644 --- a/System/Setup/Environment.HC +++ b/System/Setup/Environment.HC @@ -90,7 +90,7 @@ U0 @malloc_mem_tasks_init() @malloc_mem_tasks_init; U0 dd() { DocDump(adam_task->put_doc); } -//@patch_jmp_rel32(&Fault2, &Reboot); // Reboot instead of crashing to the debugger +@patch_jmp_rel32(&Fault2, &Reboot); // Reboot instead of crashing to the debugger U0 NoBeep(I8, Bool) {}; @patch_jmp_rel32(&Beep, &NoBeep); // Don't delay on beep when entering debugger @@ -121,5 +121,33 @@ Bool DrvLock2(CDrv* dv) return FALSE; } +CTask* SpawnQue2(U0 (*fp_addr)(U8* data), U8* data = NULL, U8* task_name = NULL, + I64 target_cpu, CTask* parent = NULL, // NULL means adam + I64 stk_size = 0, I64 flags = 1 << JOBf_ADD_TO_QUE) +{ + CTask* res; + CJob* tmpc = JobQue(fp_addr, data, target_cpu, + flags, JOBT_SPAWN_TASK, task_name, parent, stk_size); + CJobCtrl* ctrl; + + while (!Bt(&tmpc->flags, JOBf_DONE)) { + LBts(&Fs->task_flags, TASKf_IDLE); + Sleep(1); + } + LBtr(&Fs->task_flags, TASKf_IDLE); + + res = tmpc->spawned_task; + ctrl = tmpc->ctrl; + PUSHFD + CLI while (LBts(&ctrl->flags, JOBCf_LOCKED)) + Sleep(1); + QueRem(tmpc); + LBtr(&ctrl->flags, JOBCf_LOCKED); + POPFD + JobDel(tmpc); + return res; +} + @patch_jmp_rel32(&BlkDevLock, &BlkDevLock2); // Patch BlkDevLock so we don't deadlock on multiple tasks reading from virtio disk @patch_jmp_rel32(&DrvLock, &DrvLock2); // Patch DrvLock so we don't deadlock on multiple tasks reading from virtio disk +@patch_jmp_rel32(&SpawnQue, &SpawnQue2); // Patch SpawnQue so we don't deadlock on spawning multicore tasks simultaneously