fix usage of krnspinlock.
[AROS.git] / rom / task / init.c
blob75ebd528ab968f67f41306daaccf01a834ccdbe1
1 /*
2 Copyright © 2015, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 0
8 #include <aros/debug.h>
9 #include <aros/symbolsets.h>
11 #include <proto/exec.h>
12 #include <proto/kernel.h>
13 #include <resources/task.h>
15 #include <exec_intern.h>
16 #include "etask.h"
18 #include "taskres_intern.h"
20 extern APTR AROS_SLIB_ENTRY(NewAddTask, Task, 176)();
21 extern void AROS_SLIB_ENTRY(RemTask, Task, 48)();
23 static LONG taskres_Init(struct TaskResBase *TaskResBase)
25 #if defined(__AROSEXEC_SMP__)
26 spinlock_t *listLock;
27 #endif
28 struct TaskListEntry *taskEntry = NULL;
29 struct Task *curTask = NULL;
31 KernelBase = OpenResource("kernel.resource");
32 if (!KernelBase)
33 return FALSE;
35 TaskResBase->trb_UtilityBase = OpenLibrary("utility.library", 0);
36 if (!TaskResBase->trb_UtilityBase)
37 return FALSE;
39 NEWLIST(&TaskResBase->trb_TaskList);
40 NEWLIST(&TaskResBase->trb_LockedLists);
42 SysBase->lb_TaskResBase = (struct Library *)TaskResBase;
45 Use Disable/Enable to lock all access to the task list -:
46 the SpinLocks should only be used by the schedular itself, otherwise we
47 may end up with a deadlock.
50 TaskResBase->trb_NewAddTask = SetFunction((struct Library *)SysBase, -176*LIB_VECTSIZE, AROS_SLIB_ENTRY(NewAddTask, Task, 176));
51 TaskResBase->trb_RemTask = SetFunction((struct Library *)SysBase, -48*LIB_VECTSIZE, AROS_SLIB_ENTRY(RemTask, Task, 48));
54 Add existing tasks to our internal list ..
56 #if defined(__AROSEXEC_SMP__)
57 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskRunningSpinLock, NULL, SPINLOCK_MODE_READ);
58 #endif
59 Disable();
60 #if defined(__AROSEXEC_SMP__)
61 ForeachNode(&PrivExecBase(SysBase)->TaskRunning, curTask)
63 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
65 D(bug("[TaskRes] 0x%p [R ] %02d %s\n", curTask, GetIntETask(curTask)->iet_CpuNumber, curTask->tc_Node.ln_Name));
66 taskEntry->tle_Task = curTask;
67 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
70 KrnSpinUnLock(listLock);
71 Enable();
72 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskReadySpinLock, NULL, SPINLOCK_MODE_READ);
73 Disable();
74 #else
75 if (SysBase->ThisTask)
77 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
79 D(bug("[TaskRes] 0x%p [R--] 00 %s\n", SysBase->ThisTask, SysBase->ThisTask->tc_Node.ln_Name));
80 taskEntry->tle_Task = SysBase->ThisTask;
81 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
84 #endif
85 ForeachNode(&SysBase->TaskReady, curTask)
87 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
89 D(bug("[TaskRes] 0x%p [-R-] -- %s\n", curTask, curTask->tc_Node.ln_Name));
90 taskEntry->tle_Task = curTask;
91 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
94 #if defined(__AROSEXEC_SMP__)
95 KrnSpinUnLock(listLock);
96 Enable();
97 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskWaitSpinLock, NULL, SPINLOCK_MODE_READ);
98 Disable();
99 #endif
100 ForeachNode(&SysBase->TaskWait, curTask)
102 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
104 D(bug("[TaskRes] 0x%p [--W] -- %s\n", curTask, curTask->tc_Node.ln_Name));
105 taskEntry->tle_Task = curTask;
106 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
110 #if defined(__AROSEXEC_SMP__)
111 KrnSpinUnLock(listLock);
112 #endif
113 Enable();
115 return TRUE;
118 static LONG taskres_Exit(struct TaskResBase *TaskResBase)
120 SetFunction((struct Library *)SysBase, -176*LIB_VECTSIZE, TaskResBase->trb_NewAddTask);
121 SetFunction((struct Library *)SysBase, -48*LIB_VECTSIZE, TaskResBase->trb_RemTask);
123 CloseLibrary(TaskResBase->trb_UtilityBase);
125 return TRUE;
128 ADD2INITLIB(taskres_Init, 0)
130 ADD2EXPUNGELIB(taskres_Exit, 0)