home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 074.lha / Exec / listtasks.c < prev    next >
C/C++ Source or Header  |  1986-11-20  |  2KB  |  137 lines

  1. /*
  2.  *    ListTasks.c
  3.  *
  4.  *    This program produces a list of executing tasks on its standard
  5.  *    output.
  6.  *
  7.  *    Program        Date        Action
  8.  *    D. Thomas    19 April 1987    v1.0 Initial Coding.
  9.  *
  10.  */
  11.  
  12. #include "exec/execbase.h"
  13. #include "functions.h"
  14.  
  15. extern struct ExecBase *SysBase;    /* Exec's base ptr */
  16.  
  17. static char *state[] = {
  18.   "Invalid",
  19.   "Added",
  20.   "Running",
  21.   "Ready",
  22.   "Waiting",
  23.   "Except",
  24.   "Removed"
  25. };
  26.  
  27. main ()
  28.  
  29. {
  30.  
  31.   register struct Task *t;    /* ptr to scan task list */
  32.   register struct List  head;    /* for my copy of the task list */
  33.  
  34.   NewList (&head);
  35.  
  36.   Disable ();
  37.  
  38.   if (onetask (SysBase->ThisTask, &head))
  39.     cleanup (&head);
  40.  
  41.   if (gettask (&SysBase->TaskReady, &head))
  42.     cleanup (&head);
  43.  
  44.   if (gettask (&SysBase->TaskWait, &head))
  45.     cleanup (&head);
  46.  
  47.   Enable ();
  48.  
  49.   puts (" Pri State   SigAlloc  SigWait SigRecvd SigExcpt Stak StkU Name");
  50.  
  51.   while (t = (struct Task *) RemHead (&head)) {
  52.  
  53.     printf ("%4d %-7.7s %8lx %8lx %8lx %8lx %4.4lx %4.4lx %s\n",
  54.       t->tc_Node.ln_Pri, state[t->tc_State], t->tc_SigAlloc,
  55.       t->tc_SigWait, t->tc_SigRecvd, t->tc_SigExcept,
  56.       (ULONG) t->tc_SPUpper - (ULONG) t->tc_SPLower,
  57.       (ULONG) t->tc_SPUpper - (ULONG) t->tc_SPReg,
  58.       t->tc_Node.ln_Name);
  59.     FreeMem (t->tc_Node.ln_Name, (long) strlen (t->tc_Node.ln_Name) + 1);
  60.     FreeMem (t, (long) sizeof *t);
  61.  
  62.   }
  63.  
  64.   exit (0L);
  65.  
  66. }
  67.  
  68. freelist (l)
  69.  
  70. struct List *l;
  71.  
  72. {
  73.  
  74.   struct Task *t;
  75.  
  76.   while (t = (struct Task *) RemHead (l)) {
  77.     FreeMem (t->tc_Node.ln_Name, (long) strlen (t->tc_Node.ln_Name) + 1);
  78.     FreeMem (t, (long) sizeof *t);
  79.   }
  80.  
  81. }
  82.  
  83. cleanup (l)
  84.  
  85. struct List *l;
  86.  
  87. {
  88.  
  89.   Enable ();
  90.   freelist (l);
  91.   puts ("Out of Memory!");
  92.   exit (0);
  93.  
  94. }
  95.  
  96. gettask (tl, l)
  97.  
  98. struct List *tl;
  99. struct List *l;
  100.  
  101. {
  102.  
  103.   register struct Task *t;
  104.  
  105.   for (t = (struct Task *) tl->lh_Head;
  106.        t->tc_Node.ln_Succ;
  107.        t = (struct Task *) t->tc_Node.ln_Succ)
  108.     if (onetask (t, l))
  109.       return TRUE;
  110.  
  111.   return FALSE;
  112.  
  113. }
  114.  
  115. onetask (t, l)
  116.  
  117. struct Task *t;
  118. struct List *l;
  119.  
  120. {
  121.  
  122.   register struct Task *tc;
  123.  
  124.   if (!(tc = (struct Task *) AllocMem ((long) sizeof *t, 0L)))
  125.       return TRUE;
  126.   *tc = *t;
  127.   if (!(tc->tc_Node.ln_Name = (char *) AllocMem ((long) strlen (t->tc_Node.ln_Name) + 1, 0L))) {
  128.     FreeMem (tc, (long) sizeof *tc);
  129.     return TRUE;
  130.   }
  131.   strcpy (tc->tc_Node.ln_Name, t->tc_Node.ln_Name);
  132.   AddTail (l, tc);
  133.  
  134.   return FALSE;
  135.  
  136. }
  137.