]> git.mdlowis.com Git - proto/cerise-os.git/commitdiff
cleaned up some multithreading issues based on sanitizer results
authorMichael D. Lowis <mike@mdlowis.com>
Wed, 14 Sep 2022 00:18:03 +0000 (20:18 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Wed, 14 Sep 2022 00:18:03 +0000 (20:18 -0400)
Kernel.c

index cd30388a06ad5aa92112f8b85ee49155d1960b46..f5139231bda800342d93dd197459b8d4e1262ff6 100644 (file)
--- a/Kernel.c
+++ b/Kernel.c
@@ -19,6 +19,7 @@
 #define WORD_SIZE           sizeof(void*)
 #define MAX_TASKS           1024
 #define TASK_NONE           ((TaskID_T)-1)
+#define DEFAULT_STACK_SIZE  (32768)
 
 #define WORD_ALIGN(x) \
     (((x) + WORD_SIZE) & ~(WORD_SIZE))
@@ -34,7 +35,7 @@ typedef enum {
 } TaskState_T;
 
 typedef struct Task_T {
-    long* stack_top;
+    long* _Atomic stack_top;
     long* heap_top;
     long* memory;
     struct Task_T* next;
@@ -91,10 +92,7 @@ static void WaitForTaskFree(TaskID_T prev, TaskID_T next)
 {
     if (next != TASK_NONE && prev != next)
     {
-        Task_T* ntask = &Tasks[next];
-        assert(ntask);
-
-        while (!atomic_load(&ntask->stack_top))
+        while (!atomic_load(&Tasks[next].stack_top))
         {
         }
     }
@@ -249,10 +247,14 @@ void PickNewTask(bool dead)
 
     WaitForTaskFree(prev, Running[CpuID].task);
     SwapTask(prev_task, next_task);
+
     if (Running[CpuID].dead != TASK_NONE)
     {
-        WaitForTaskFree(prev, Running[CpuID].dead);
+        WaitForTaskFree(TASK_NONE, Running[CpuID].dead);
+        AcquireLock();
         free(Tasks[Running[CpuID].dead].memory);
+        Tasks[Running[CpuID].dead].memory = NULL;
+        ReleaseLock();
         Running[CpuID].dead = TASK_NONE;
     }
 }
@@ -269,7 +271,6 @@ void Kernel_Exit(void)
 
 static TaskID_T AllocateTaskID(void)
 {
-    AcquireLock();
     TaskID_T tid = TASK_NONE;
     if (TaskCount < MAX_TASKS)
     {
@@ -281,7 +282,6 @@ static TaskID_T AllocateTaskID(void)
         /* TODO: iterate over table to find free slot... */
         assert(!"out of task IDs");
     }
-    ReleaseLock();
     return tid;
 }
 
@@ -290,7 +290,7 @@ static void InitializeTask(Task_T* task, void (*task_fn)(void*), void* arg, long
     /* allocate a new task. default memory size is used if 0 provided */
     if (memsz == 0)
     {
-        memsz = 32768;
+        memsz = DEFAULT_STACK_SIZE;
     }
     memsz = WORD_ALIGN(memsz);
     task->memory    = calloc(1, WORD_ALIGN(memsz));
@@ -318,14 +318,14 @@ static void InitializeTask(Task_T* task, void (*task_fn)(void*), void* arg, long
 
 TaskID_T Kernel_Spawn(void (*task_fn)(void*), void* arg, long int argsz, long int memsz)
 {
+    AcquireLock();
     TaskID_T tid = AllocateTaskID();
     if (tid != TASK_NONE)
     {
         InitializeTask(&Tasks[tid], task_fn, arg, argsz, memsz);
-        AcquireLock();
         Enter(tid);
-        ReleaseLock();
     }
+    ReleaseLock();
     return tid;
 }
 
@@ -420,6 +420,7 @@ void task1(void* arg)
     int* val = arg;
     for (int i = 0; i < 1000; i++)
     {
+        (void)val;
         printf("%d %d\n", *val, CpuID);
         Kernel_Yield();
     }