only replace newaddtask since addtask calls it on aros anyhows
[AROS.git] / rom / task / init.c
blob4ac43c4b803ad1fa69f43c1f5183497d3ece5b6c
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>
17 #include "taskres_intern.h"
19 extern APTR AROS_SLIB_ENTRY(NewAddTask, Task, 176)();
20 extern void AROS_SLIB_ENTRY(RemTask, Task, 48)();
22 struct TaskResBase *internTaskResBase = NULL;
24 static LONG taskres_Init(struct TaskResBase *TaskResBase)
26 #if defined(__AROSEXEC_SMP__)
27 spinlock_t *listLock;
28 #endif
29 struct TaskListEntry *taskEntry = NULL;
30 struct Task *curTask = NULL;
32 KernelBase = OpenResource("kernel.resource");
33 if (!KernelBase)
34 return FALSE;
36 internTaskResBase = TaskResBase;
38 NEWLIST(&TaskResBase->trb_TaskList);
39 NEWLIST(&TaskResBase->trb_LockedLists);
41 TaskResBase->trb_NewAddTask = SetFunction((struct Library *)SysBase, -176*LIB_VECTSIZE, AROS_SLIB_ENTRY(NewAddTask, Task, 176));
42 TaskResBase->trb_RemTask = SetFunction((struct Library *)SysBase, -48*LIB_VECTSIZE, AROS_SLIB_ENTRY(RemTask, Task, 48));
45 Add existing tasks to our internal list ..
47 #if defined(__AROSEXEC_SMP__)
48 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskRunningSpinLock, SPINLOCK_MODE_READ);
49 ForeachNode(&PrivExecBase(SysBase)->TaskRunning, curTask)
51 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
53 taskEntry->tle_Task = curTask;
54 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
57 KrnSpinUnLock(listLock);
58 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskReadySpinLock, SPINLOCK_MODE_READ);
59 #else
60 if (SysBase->ThisTask)
62 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
64 taskEntry->tle_Task = SysBase->ThisTask;
65 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
68 #endif
69 ForeachNode(&SysBase->TaskReady, curTask)
71 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
73 taskEntry->tle_Task = curTask;
74 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
77 #if defined(__AROSEXEC_SMP__)
78 KrnSpinUnLock(listLock);
79 listLock = KrnSpinLock(&PrivExecBase(SysBase)->TaskWaitSpinLock, SPINLOCK_MODE_READ);
80 #endif
81 ForeachNode(&SysBase->TaskWait, curTask)
83 if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL)
85 taskEntry->tle_Task = curTask;
86 AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node);
89 #if defined(__AROSEXEC_SMP__)
90 KrnSpinUnLock(listLock);
91 #endif
93 return TRUE;
96 ADD2INITLIB(taskres_Init, 0)