2 Copyright © 2015, The AROS Development Team. All rights reserved.
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__)
29 struct TaskListEntry
*taskEntry
= NULL
;
30 struct Task
*curTask
= NULL
;
32 KernelBase
= OpenResource("kernel.resource");
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
);
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
);
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
);
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
);
96 ADD2INITLIB(taskres_Init
, 0)