2 Copyright © 1995-2017, The AROS Development Team. All rights reserved.
9 /******************************************************************************
26 Prints a list of all tasks.
44 ******************************************************************************/
48 #include <exec/memory.h>
49 #include <exec/tasks.h>
50 #include <exec/execbase.h>
51 #include <proto/exec.h>
52 #include <proto/timer.h>
53 #include <aros/debug.h>
54 #include <devices/timer.h>
55 #include <dos/dosextens.h>
56 #include <proto/dos.h>
57 #include <proto/task.h>
59 #include <resources/task.h>
61 const TEXT version
[] = "$VER: TaskList 42.2 (21.01.2017)\n";
63 APTR TaskResBase
= NULL
;
73 struct timeval cputime
;
76 static int addtask(struct List
*tasks
, struct Task
*task
)
79 STRPTR s1
,s2
, e
= NULL
;
81 struct TagItem QueryTaskTags
[] =
83 {TaskTag_CPUTime
, 0 },
88 if (task
->tc_Node
.ln_Type
== NT_PROCESS
&& ((struct Process
*)task
)->pr_CLI
)
90 struct CommandLineInterface
*cli
= BADDR(((struct Process
*)task
)->pr_CLI
);
92 if (cli
->cli_CommandName
)
93 s1
= AROS_BSTR_ADDR(cli
->cli_CommandName
);
95 s1
= task
->tc_Node
.ln_Name
;
98 s1
= task
->tc_Node
.ln_Name
;
101 t
= AllocVec(sizeof(struct task
), MEMF_CLEAR
|MEMF_PUBLIC
);
104 t
= AllocVec(sizeof(struct task
) + strlen(s1
) + 1, MEMF_CLEAR
|MEMF_PUBLIC
);
105 e
= (STRPTR
)&t
[1] + strlen(s1
);
111 #if defined(__AROS__)
112 QueryTaskTags
[0].ti_Data
= (IPTR
)&t
->cputime
;
113 QueryTaskTagList(task
, QueryTaskTags
);
117 if (task
->tc_Node
.ln_Type
== NT_PROCESS
&& ((struct Process
*)task
)->pr_CLI
)
118 t
->node
.ln_Type
= -1;
120 t
->node
.ln_Type
= task
->tc_Node
.ln_Type
;
121 t
->node
.ln_Pri
= task
->tc_Node
.ln_Pri
;
122 t
->state
= task
->tc_State
;
123 t
->stacksize
= (STRPTR
)task
->tc_SPUpper
- (STRPTR
)task
->tc_SPLower
;
124 #if AROS_STACK_GROWS_DOWNWARDS
125 t
->stackused
= (STRPTR
)task
->tc_SPUpper
- SP_OFFSET
- (STRPTR
)task
->tc_SPReg
;
127 t
->stackused
= (STRPTR
)task
->tc_SPReg
- SP_OFFSET
- (STRPTR
)task
->tc_SPLower
;
129 if (task
->tc_State
== TS_RUN
)
131 /* The tc_SPReg for the actual process is invalid
132 if it had no context switch yet */
149 AddTail(tasks
, &t
->node
);
154 static int fillbuffer(struct List
*tasks
)
158 #if !defined(__AROS__)
161 if (!addtask(task
, FindTask(NULL
)))
166 for (task
= (struct Task
*)SysBase
->TaskReady
.lh_Head
;
167 task
->tc_Node
.ln_Succ
!= NULL
;
168 task
= (struct Task
*)task
->tc_Node
.ln_Succ
)
170 if (!addtask(tasks
, task
))
176 for (task
= (struct Task
*)SysBase
->TaskWait
.lh_Head
;
177 task
->tc_Node
.ln_Succ
!= NULL
;
178 task
= (struct Task
*)task
->tc_Node
.ln_Succ
)
180 if (!addtask(tasks
, task
))
188 struct TaskList
*taskList
;
190 taskList
= LockTaskList(LTF_ALL
);
191 while ((task
= NextTaskEntry(taskList
, LTF_ALL
)) != NULL
)
193 if (!addtask(tasks
, task
))
198 UnLockTaskList(taskList
, LTF_ALL
);
206 struct task
*currentTask
, *tmpTask
;
210 #if defined(__AROS__)
211 TaskResBase
= OpenResource("task.resource");
213 PutStr("Can't open task.resource\n");
220 retval
= fillbuffer(&tasks
);
222 if (!IsListEmpty(&tasks
))
224 PutStr("Address\t\tType\tPri\tState\tCPU Time\tStack\tUsed\tName\n");
225 ForeachNodeSafe(&tasks
, currentTask
, tmpTask
)
229 Remove((struct Node
*)currentTask
);
231 time
= currentTask
->cputime
.tv_secs
;
232 Printf("0x%08.ix\t%s\t%ld\t%s\t%03ld:%02ld:%02ld\t%id\t%id\t%s\n",
233 currentTask
->address
,
234 (currentTask
->node
.ln_Type
== NT_TASK
) ? "task" :
235 (currentTask
->node
.ln_Type
== NT_PROCESS
) ? "process" : "CLI",
236 (ULONG
)currentTask
->node
.ln_Pri
,
237 (currentTask
->state
== TS_RUN
) ? "running" :
238 (currentTask
->state
== TS_READY
) ? "ready" : "waiting",
239 (time
/ 60 / 60), (time
/ 60) % 60, time
% 60,
240 currentTask
->stacksize
, currentTask
->stackused
,
241 (currentTask
->node
.ln_Name
!= NULL
) ? currentTask
->node
.ln_Name
: "(null)");
243 FreeVec(currentTask
);