2 Copyright © 1995-2015, The AROS Development Team. All rights reserved.
9 /******************************************************************************
26 Prints a list of all tasks.
44 ******************************************************************************/
46 #include <exec/memory.h>
47 #include <exec/tasks.h>
48 #include <exec/execbase.h>
49 #include <proto/exec.h>
50 #include <proto/timer.h>
51 #include <aros/debug.h>
52 #include <devices/timer.h>
53 #include <dos/dosextens.h>
54 #include <proto/dos.h>
55 #include <proto/task.h>
57 #include <resources/task.h>
59 const TEXT version
[] = "$VER: tasklist 42.0 (02.5.2015)\n";
61 APTR TaskResBase
= NULL
;
73 struct timeval cputime
;
76 static int addtask(struct Task
*task
, struct task
**t
, STRPTR
*e
)
79 struct TagItem QueryTaskTags
[] =
81 {TaskTag_CPUTime
, (IPTR
)&(*t
)->cputime
},
85 QueryTaskTagList(task
, QueryTaskTags
);
88 (*t
)->type
= task
->tc_Node
.ln_Type
;
89 (*t
)->pri
= (WORD
)task
->tc_Node
.ln_Pri
;
90 (*t
)->state
= task
->tc_State
;
91 (*t
)->stacksize
= (STRPTR
)task
->tc_SPUpper
- (STRPTR
)task
->tc_SPLower
;
92 #if AROS_STACK_GROWS_DOWNWARDS
93 (*t
)->stackused
= (STRPTR
)task
->tc_SPUpper
- SP_OFFSET
- (STRPTR
)task
->tc_SPReg
;
95 (*t
)->stackused
= (STRPTR
)task
->tc_SPReg
- SP_OFFSET
- (STRPTR
)task
->tc_SPLower
;
97 if (task
->tc_State
== TS_RUN
)
99 /* The tc_SPReg for the actual process is invalid
100 if it had no context switch yet */
103 s1
= task
->tc_Node
.ln_Name
;
104 if (task
->tc_Node
.ln_Type
== NT_PROCESS
&& ((struct Process
*)task
)->pr_CLI
)
106 /* TODO: Use cli_CommandName field for the name */
123 if ((STRPTR
)(*t
+ 1) > *e
)
132 static int fillbuffer(struct task
**buffer
, IPTR size
)
134 STRPTR end
= (STRPTR
)*buffer
+ size
;
137 #if !defined(__AROS__)
140 if (!addtask(FindTask(NULL
), buffer
, &end
))
145 for (task
= (struct Task
*)SysBase
->TaskReady
.lh_Head
;
146 task
->tc_Node
.ln_Succ
!= NULL
;
147 task
= (struct Task
*)task
->tc_Node
.ln_Succ
)
149 if (!addtask(task
, buffer
, &end
))
155 for (task
= (struct Task
*)SysBase
->TaskWait
.lh_Head
;
156 task
->tc_Node
.ln_Succ
!= NULL
;
157 task
= (struct Task
*)task
->tc_Node
.ln_Succ
)
159 if (!addtask(task
, buffer
, &end
))
167 struct TaskList
*taskList
;
169 taskList
= LockTaskList(0);
170 while ((task
= NextTaskEntry(taskList
, 0)) != NULL
)
172 if (!addtask(task
, buffer
, &end
))
188 struct task
*buffer
,*tasks
,*tasks2
;
190 TaskResBase
= OpenResource("task.resource");
192 FPuts(Output(),"Can't open task.resource\n");
196 for(size
= 2048; ; size
+= 2048)
198 buffer
= AllocVec(size
, MEMF_ANY
);
201 FPuts(Output(),"Not Enough memory for task buffer\n");
205 if (fillbuffer(&tasks
, size
))
207 FPuts(Output(), "Address\t\tType\tPri\tState\tCPU Time\tStack\tUsed\tName\n");
208 for (tasks2
= buffer
; tasks2
< tasks
; tasks2
++)
213 args
[0] = (IPTR
)tasks2
->address
;
214 args
[1] = (IPTR
)((tasks2
->type
== NT_TASK
) ? "task" :
215 (tasks2
->type
== NT_PROCESS
) ? "process" : "CLI" );
216 args
[2] = tasks2
->pri
;
217 args
[3] = (IPTR
)((tasks2
->state
== TS_RUN
) ? "running" :
218 (tasks2
->state
== TS_READY
) ? "ready" : "waiting" );
220 time
= tasks2
->cputime
.tv_secs
;
227 args
[7] = tasks2
->stacksize
;
228 args
[8] = tasks2
->stackused
;
229 args
[9] = (tasks2
->name
!= NULL
) ? (IPTR
)tasks2
->name
: 0;
230 VPrintf("0x%08.lx\t%s\t%ld\t%s\t%02ld:%02ld:%02ld\t%ld\t%ld\t%s\n", args
);