2 Copyright © 1995-2015, The AROS Development Team. All rights reserved.
5 Desc: exec.library's internal service task. Performs memory management according
6 to task scheduler's requests.
10 #include <aros/debug.h>
11 #include <exec/execbase.h>
12 #include <exec/tasks.h>
13 #include <aros/libcall.h>
14 #include <proto/exec.h>
15 #include <proto/kernel.h>
17 #include "exec_intern.h"
18 #include "exec_util.h"
19 #include "exec_debug.h"
21 void ServiceTask(struct ExecBase
*SysBase
)
23 DINIT("Service task started up");
28 struct MemList
*mb
, *mbnext
;
30 while ((task
= (struct Task
*)GetMsg(PrivExecBase(SysBase
)->ServicePort
)))
32 D(bug("[exec] Service request for task 0x%p, state %d\n", task
, task
->tc_State
);)
35 * If we ever need to use TSS here, we'll need to explicitly check its size here.
36 * However we don't need this, because we never call so high-level libraries.
37 * So, currently we ignore this.
40 switch (task
->tc_State
)
43 DREMTASK("Removal request for task 0x%p <%s>", task
, task
->tc_Node
.ln_Name
);
46 * Note tc_MemEntry list is part of the task structure which
47 * usually is also placed in tc_MemEntry. MungWall_Check()
48 * will fill freed memory and destroy our list while we are
49 * iterating or the freed memory including our list could be
50 * reused by some other task. We take special care of this by
51 * resetting ln_Succ of the last node to NULL. This way we
52 * avoid getting back to our List structure.
54 task
->tc_MemEntry
.lh_TailPred
->ln_Succ
= NULL
;
56 for (mb
= (struct MemList
*)task
->tc_MemEntry
.lh_Head
; mb
; mb
= mbnext
)
58 /* Free one MemList node */
59 mbnext
= (struct MemList
*)mb
->ml_Node
.ln_Succ
;
61 DREMTASK("Freeing MemList 0x%p", mb
);
67 /* FIXME: Add fault handling here. Perhaps kernel-level GURU. */
69 /* The task is ready to run again. Move it back to TaskReady list. */
70 task
->tc_State
= TS_READY
;
71 #if defined(__AROSEXEC_SMP__)
72 EXEC_SPINLOCK_LOCK(&PrivExecBase(SysBase
)->TaskReadySpinLock
, SPINLOCK_MODE_READ
);
75 Enqueue(&SysBase
->TaskReady
, &task
->tc_Node
);
76 #if defined(__AROSEXEC_SMP__)
77 EXEC_SPINLOCK_UNLOCK(&PrivExecBase(SysBase
)->TaskReadySpinLock
);
84 WaitPort(PrivExecBase(SysBase
)->ServicePort
);