pull in the exec smp setting via etask.h
[AROS.git] / rom / task / init.c
blob756df9b8d38bf62a6775692fc5ef98c0ff534cea
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 "etask.h"
17 #include "taskres_intern.h"
19 extern APTR AROS_SLIB_ENTRY(AddTask, Task, 47);
20 extern APTR AROS_SLIB_ENTRY(NewAddTask, Task, 176);
21 extern APTR AROS_SLIB_ENTRY(RemTask, Task, 48);
23 struct TaskResBase *internTaskResBase = NULL;
25 static LONG taskres_Init(struct TaskResBase *TaskResBase)
27 #if defined(__AROSEXEC_SMP__)
28 spinlock_t *listLock;
29 #endif
30 struct TaskListEntry *taskEntry = NULL;
31 struct Task *curTask = NULL;
33 KernelBase = OpenResource("kernel.resource");
34 if (!KernelBase)
35 return FALSE;
37 internTaskResBase = TaskResBase;
39 NEWLIST(&TaskResBase->trb_TaskList);
40 NEWLIST(&TaskResBase->trb_LockedLists);
42 TaskResBase->trb_AddTask = SetFunction((struct Library *)SysBase, -47*LIB_VECTSIZE, AROS_SLIB_ENTRY(AddTask, Task, 47));
43 TaskResBase->trb_NewAddTask = SetFunction((struct Library *)SysBase, -176*LIB_VECTSIZE, AROS_SLIB_ENTRY(NewAddTask, Task, 176));
44 TaskResBase->trb_RemTask = SetFunction((struct Library *)SysBase, -48*LIB_VECTSIZE, AROS_SLIB_ENTRY(RemTask, Task, 48));
47 Add existing tasks to our internal list ..
49 #if defined(__AROSEXEC_SMP__)
50 listLock = KrnSpinLock(&SysBase->TaskRunningSpinLock, SPINLOCK_MODE_READ);
51 ForeachNode(&SysBase->TaskRunning, curTask)
53 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
55 taskEntry->tle_Task = curTask;
56 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
59 KrnSpinUnLock(listLock);
60 listLock = KrnSpinLock(&SysBase->TaskReadySpinLock, SPINLOCK_MODE_READ);
61 #else
62 if (SysBase->ThisTask)
64 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
66 taskEntry->tle_Task = SysBase->ThisTask;
67 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
70 #endif
71 ForeachNode(&SysBase->TaskReady, curTask)
73 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
75 taskEntry->tle_Task = curTask;
76 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
79 #if defined(__AROSEXEC_SMP__)
80 KrnSpinUnLock(listLock);
81 listLock = KrnSpinLock(&SysBase->TaskWaitSpinLock, SPINLOCK_MODE_READ);
82 #endif
83 ForeachNode(&SysBase->TaskWait, curTask)
85 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
87 taskEntry->tle_Task = curTask;
88 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
91 #if defined(__AROSEXEC_SMP__)
92 KrnSpinUnLock(listLock);
93 #endif
95 return TRUE;
98 ADD2INITLIB(taskres_Init, 0)