;/* tasklist.c - Execute me to compile me with SAS C 5.10
LC -b1 -cfistq -v -y -j73 tasklist.c
Blink FROM LIB:c.o,tasklist.o TO tasklist LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit
tasklist.c - Snapshots and prints the ExecBase task list
*/
#include <exec/types.h>
#include <exec/lists.h>
#include <exec/nodes.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <stdio.h>
#include <string.h>
#ifdef LATTICE
int CXBRK(void) { return(0); } /* disable SAS/C CTRL-C handing */
int chkabort(void) {return(0); }
#endif
static UBYTE *VersTag = "$VER: tasklist 37.2 (31.3.92)";
extern struct ExecBase *SysBase;
/* Use extended structure to hold task information */
struct TaskNode {
struct Node tn_Node;
ULONG tn_TaskAddress;
ULONG tn_SigAlloc;
ULONG tn_SigWait;
UBYTE tn_Name[32];
};
void main(int argc, char **argv)
{
struct List *ourtasklist;
struct List *exectasklist;
struct Task *task;
struct TaskNode *node, *tnode, *rnode = NULL;
struct Node *execnode;
/* Allocate memory for our list */
if (ourtasklist = AllocMem(sizeof(struct List), MEMF_CLEAR)) {
/* Initialize list structure (ala NewList()) */
ourtasklist->lh_Head = (struct Node *)&ourtasklist->lh_Tail;
ourtasklist->lh_Tail = 0;
ourtasklist->lh_TailPred = (struct Node *)&ourtasklist->lh_Head;
/* Make sure tasks won't switch lists or go away */
Disable();
/* Snapshot task WAIT list */
exectasklist = &(SysBase->TaskWait);
for (execnode = exectasklist->lh_Head;
execnode->ln_Succ; execnode = execnode->ln_Succ)
{
if (tnode = AllocMem(sizeof(struct TaskNode), MEMF_CLEAR))
{
/* Save task information we want to print */
strncpy(tnode->tn_Name, execnode->ln_Name, 32);
tnode->tn_Node.ln_Pri = execnode->ln_Pri;
tnode->tn_TaskAddress = (ULONG)execnode;
tnode->tn_SigAlloc = ((struct Task *)execnode)->tc_SigAlloc;
tnode->tn_SigWait = ((struct Task*)execnode)->tc_SigWait;
AddTail(ourtasklist, (struct Node *)tnode);
}
else break;
}
/* Snapshot task READY list */
exectasklist = &(SysBase->TaskReady);
for (execnode = exectasklist->lh_Head;
execnode->ln_Succ; execnode = execnode->ln_Succ)
{
if (tnode = AllocMem(sizeof(struct TaskNode), MEMF_CLEAR))
{
/* Save task information we want to print */
strncpy(tnode->tn_Name, execnode->ln_Name, 32);
tnode->tn_Node.ln_Pri = execnode->ln_Pri;
tnode->tn_TaskAddress = (ULONG)execnode;
tnode->tn_SigAlloc = ((struct Task *)execnode)->tc_SigAlloc;
tnode->tn_SigWait = ((struct Task*)execnode)->tc_SigWait;
AddTail(ourtasklist, (struct Node *)tnode);
if(!rnode) rnode = tnode; /* first READY task */
}
else
break;
}
/* Re-enable interrupts and taskswitching */
Enable();
/* Print now (printing above would have defeated a Forbid or Disable) */
printf("Pri Address SigAlloc SigWait Taskname\n");
node = (struct TaskNode *)(ourtasklist->lh_Head);
printf("\nWAITING:\n");
while (tnode = (struct TaskNode *)node->tn_Node.ln_Succ)
{
if(tnode == rnode)
printf("\nREADY:\n"); /* we set rnode above */
printf("%02d 0x%08lx 0x%08lx 0x%08lx %s\n",
node->tn_Node.ln_Pri, node->tn_TaskAddress, node->tn_SigAlloc,
node->tn_SigWait, node->tn_Name);
/* Free the memory, no need to remove the node, referenced once only */
FreeMem(node,sizeof(struct TaskNode));
node = tnode;
}
FreeMem(ourtasklist, sizeof(struct List));
/* Say who we are */
printf("\nTHIS TASK:\n");
task = FindTask(NULL);
printf("%02d 0x%08lx 0x%08lx 0x%08lx %s\n",
task->tc_Node.ln_Pri, task, task->tc_SigAlloc,
task->tc_SigWait, task->tc_Node.ln_Name);
}
}