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>
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__)
28 struct TaskListEntry
*taskEntry
= NULL
;
29 struct Task
*curTask
= NULL
;
31 KernelBase
= OpenResource("kernel.resource");
35 TaskResBase
->trb_UtilityBase
= OpenLibrary("utility.library", 0);
36 if (!TaskResBase
->trb_UtilityBase
)
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
);
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
);
72 listLock
= KrnSpinLock(&PrivExecBase(SysBase
)->TaskReadySpinLock
, NULL
, SPINLOCK_MODE_READ
);
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
);
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
);
97 listLock
= KrnSpinLock(&PrivExecBase(SysBase
)->TaskWaitSpinLock
, NULL
, SPINLOCK_MODE_READ
);
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
);
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
);
128 ADD2INITLIB(taskres_Init
, 0)
130 ADD2EXPUNGELIB(taskres_Exit
, 0)