home *** CD-ROM | disk | FTP | other *** search
/ Amiga Times / AmigaTimes.iso / demos / programme / WarpUPV3 / WarpUP-WarpOS / Source / tools / stat / stat.c < prev   
Encoding:
C/C++ Source or Header  |  1998-10-06  |  3.8 KB  |  160 lines

  1. /* WarpOS tool program which displays task statistics
  2.    If an argument is passed, it's threated as filter value to
  3.    produce more stable timing values. Default is 10, Max. is 20
  4.    1.3.1998 by Sam Jordan */
  5.  
  6. #define MAXCOUNT 20
  7. #define MAXTASKS 100            /* probably enough for a while */
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <exec/libraries.h>
  12. #include <dos/rdargs.h>
  13. #include <utility/tagitem.h>
  14. #include <powerpc/powerpc.h>
  15. #include <powerpc/tasksppc.h>
  16. #include <clib/dos_protos.h>
  17. #include <clib/powerpc_protos.h>
  18.  
  19. extern struct Library* PowerPCBase;
  20. int taskcount = 0;
  21.  
  22. struct sysinfo_s
  23. {
  24.     int     CPUload;
  25.     int     Systemload;
  26. } sysinfo[MAXCOUNT];
  27.  
  28. struct taskstat_s
  29. {
  30.     short CPUusage;
  31.     short Busy;
  32.     short Activity;
  33. };
  34.  
  35. struct taskinfo_s
  36. {
  37.     char*   name;
  38.     int     id;
  39.     int     nice;
  40.     struct taskstat_s taskstat[MAXCOUNT];
  41.     float   FinalCPUusage;
  42.     float   FinalBusy;
  43.     float   FinalActivity;
  44. } taskinfo[MAXTASKS];
  45.  
  46. struct TagItem Infotags[3] = {GETINFO_CPULOAD,0,
  47.                   GETINFO_SYSTEMLOAD,0,
  48.                   TAG_DONE,0};
  49.  
  50. struct taskinfo_s* FindTaskEntry(struct TaskPPC* task)
  51. {
  52.     int i;
  53.     for (i=0;i<taskcount;i++)
  54.     {
  55.         if (taskinfo[i].id == task->tp_Id)
  56.             return(&(taskinfo[i]));
  57.     }
  58.     taskinfo[taskcount].name = task->tp_Task.tc_Node.ln_Name;
  59.     taskinfo[taskcount].id = task->tp_Id;
  60.     taskinfo[taskcount].nice = task->tp_Nice;
  61.     taskcount++;
  62.     return(&(taskinfo[taskcount-1]));
  63. }
  64.  
  65. void GetSysInfo(int index)
  66. {
  67.     GetInfo(Infotags);
  68.     sysinfo[index].CPUload = Infotags[0].ti_Data;
  69.     sysinfo[index].Systemload = Infotags[1].ti_Data;
  70. }
  71.  
  72. void GetStats(int index)
  73. {
  74.     struct TaskPtr* ptr;
  75.     struct TaskPPC* task;
  76.     struct taskinfo_s* tinfo;
  77.  
  78.     ptr = LockTaskList();
  79.     while ((struct TaskPtr *)(ptr->tptr_Node.ln_Succ))
  80.     {
  81.         task = ptr->tptr_Task;
  82.         tinfo = FindTaskEntry(task);
  83.         tinfo->taskstat[index].CPUusage = task->tp_CPUusage;
  84.         tinfo->taskstat[index].Busy = task->tp_Busy;
  85.         tinfo->taskstat[index].Activity = task->tp_Activity;
  86.         ptr = (struct TaskPtr *)(ptr->tptr_Node.ln_Succ);
  87.     }
  88.     UnLockTaskList(ptr);
  89. }
  90.  
  91. void main(void)
  92. {
  93.     int i,j;
  94.     int filtercount = 10;
  95.     float   FinalCPUload=0.0;
  96.     float   FinalSystemload=0.0;
  97.     char template[] = "FILTER/N";
  98.     int* array = NULL;
  99.     struct RDArgs* result;
  100.  
  101.     if (PowerPCBase->lib_Version < 14)
  102.     {
  103.         printf("Error: powerpc.library V14+ required");
  104.         return;
  105.     }
  106.     if ((result = ReadArgs(template,(LONG *)&array,NULL)) == NULL)
  107.     {
  108.         printf("Error: dos/ReadArgs failed\n");
  109.         return;
  110.     }
  111.     if (array)
  112.         filtercount = *array;
  113.     filtercount = (filtercount < 1) ? 1 : filtercount;
  114.     filtercount = (filtercount > MAXCOUNT) ? MAXCOUNT : filtercount;
  115.     FreeArgs(result);
  116.     GetSysInfo(0);
  117.     GetStats(0);
  118.     for (i=1;i<filtercount;i++)
  119.     {
  120.         WaitTime(0,100000);     /* 100ms */
  121.         GetSysInfo(i);
  122.         GetStats(i);
  123.     }
  124.     for (i=0;i<filtercount;i++)
  125.     {
  126.         FinalCPUload += (float)sysinfo[i].CPUload;
  127.         FinalSystemload += (float)sysinfo[i].Systemload;
  128.     }
  129.     FinalCPUload = FinalCPUload / (100*filtercount);
  130.     FinalSystemload = FinalSystemload / (100*filtercount);
  131.     for (i=0;i<taskcount;i++)
  132.     {
  133.         int a=0,b=0,c=0;
  134.  
  135.         for (j=0;j<filtercount;j++)
  136.         {
  137.             a += taskinfo[i].taskstat[j].CPUusage;
  138.             b += taskinfo[i].taskstat[j].Busy;
  139.             c += taskinfo[i].taskstat[j].Activity;
  140.         }
  141.         taskinfo[i].FinalCPUusage = (float)a/(100*filtercount);
  142.         taskinfo[i].FinalBusy = (float)b/(100*filtercount);
  143.         taskinfo[i].FinalActivity = (float)c/(100*filtercount);
  144.     }
  145.     printf("\nTask statistics:\n\n");
  146.     printf("Task name                 ID     NICE  CPUusage  Busy      Activity\n");
  147.     printf("-------------------------------------------------------------------\n");
  148.     for (i=0;i<taskcount;i++)
  149.     {
  150.         printf("%-25.25s %5d   %3d   %6.2f%%   %6.2f%%   %6.2f%%\n",
  151.             taskinfo[i].name,taskinfo[i].id,taskinfo[i].nice,
  152.             taskinfo[i].FinalCPUusage,taskinfo[i].FinalBusy,
  153.             taskinfo[i].FinalActivity);
  154.     }
  155.     printf("\n");
  156.     printf("CPU load:    %9.2f%%\n",FinalCPUload);
  157.     printf("System load: %9.2f%%\n",FinalSystemload);
  158.     printf("\n");
  159. }
  160.