kernel.resource: Add missing $(PRIV_EXEC_INCLUDES), and the reason why.
[AROS.git] / rom / task / init.c
blob347d9f862675fb90cd9e38a980ed3a380c5fca01
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;
44 TaskResBase->trb_NewAddTask = SetFunction((struct Library *)SysBase, -176*LIB_VECTSIZE, AROS_SLIB_ENTRY(NewAddTask, Task, 176));
45 TaskResBase->trb_RemTask = SetFunction((struct Library *)SysBase, -48*LIB_VECTSIZE, AROS_SLIB_ENTRY(RemTask, Task, 48));
48 Add existing tasks to our internal list ..
50 #if defined(__AROSEXEC_SMP__)
51 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskRunningSpinLock, NULL, SPINLOCK_MODE_READ);
52 Forbid();
53 ForeachNode(&PrivExecBase(SysBase)->TaskRunning, curTask)
55 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
57 D(bug("[TaskRes] 0x%p [R ] %02d %s\n", curTask, GetIntETask(curTask)->iet_CpuNumber, curTask->tc_Node.ln_Name));
58 taskEntry->tle_Task = curTask;
59 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
62 KrnSpinUnLock(listLock);
63 Permit();
64 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskSpinningLock, NULL, SPINLOCK_MODE_READ);
65 Forbid();
66 ForeachNode(&PrivExecBase(SysBase)->TaskSpinning, curTask)
68 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
70 D(bug("[TaskRes] 0x%p [ S] %02d %s\n", curTask, GetIntETask(curTask)->iet_CpuNumber, curTask->tc_Node.ln_Name));
71 taskEntry->tle_Task = curTask;
72 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
75 KrnSpinUnLock(listLock);
76 Permit();
77 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskReadySpinLock, NULL, SPINLOCK_MODE_READ);
78 Forbid();
79 // TODO : list TaskSpinning tasks..
80 #else
81 Disable();
82 if (SysBase->ThisTask)
84 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
86 D(bug("[TaskRes] 0x%p [R--] 00 %s\n", SysBase->ThisTask, SysBase->ThisTask->tc_Node.ln_Name));
87 taskEntry->tle_Task = SysBase->ThisTask;
88 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
91 #endif
92 ForeachNode(&SysBase->TaskReady, curTask)
94 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
96 D(bug("[TaskRes] 0x%p [-R-] -- %s\n", curTask, curTask->tc_Node.ln_Name));
97 taskEntry->tle_Task = curTask;
98 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
101 #if defined(__AROSEXEC_SMP__)
102 KrnSpinUnLock(listLock);
103 Permit();
104 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskWaitSpinLock, NULL, SPINLOCK_MODE_READ);
105 Forbid();
106 #endif
107 ForeachNode(&SysBase->TaskWait, curTask)
109 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
111 D(bug("[TaskRes] 0x%p [--W] -- %s\n", curTask, curTask->tc_Node.ln_Name));
112 taskEntry->tle_Task = curTask;
113 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
117 #if defined(__AROSEXEC_SMP__)
118 KrnSpinUnLock(listLock);
119 Permit();
120 #else
121 Enable();
122 #endif
124 return TRUE;
127 static LONG taskres_Exit(struct TaskResBase *TaskResBase)
129 SetFunction((struct Library *)SysBase, -176*LIB_VECTSIZE, TaskResBase->trb_NewAddTask);
130 SetFunction((struct Library *)SysBase, -48*LIB_VECTSIZE, TaskResBase->trb_RemTask);
132 CloseLibrary(TaskResBase->trb_UtilityBase);
134 return TRUE;
137 ADD2INITLIB(taskres_Init, 0)
139 ADD2EXPUNGELIB(taskres_Exit, 0)