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>
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__)
30 struct TaskListEntry
*taskEntry
= NULL
;
31 struct Task
*curTask
= NULL
;
33 KernelBase
= OpenResource("kernel.resource");
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
);
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
);
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
);
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
);
98 ADD2INITLIB(taskres_Init
, 0)