semSmShow.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:9k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* semSmShow.c - shared memory semaphore show utility (VxMP Option) */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01j,06may02,mas  cache flush and volatile fix (SPR 68334); bridge flush fix
  7.  (SPR 68844)
  8. 01i,24oct01,mas  doc update (SPR 71149)
  9. 01h,03feb93,jdi  changed INCLUDE_SHOW_RTNS to ...ROUTINES.
  10. 01g,29jan93,pme  added little endian support.
  11. 01f,13nov92,dnw  added include of private/smObjLibP.h
  12. 01e,02oct92,pme  added SPARC support. documentation cleanup.
  13. 01d,29sep92,pme  fixed WARNING in printf calls.
  14. 01c,29jul92,pme  changed module name to semSmShow in first line.
  15. 01b,28jul92,jcf  changed semSmShowInit to call semLibInit.
  16. 01a,19jul92,pme  written.
  17. */
  18. /*
  19. DESCRIPTION
  20. This library provides routines to show shared semaphore statistics, such as
  21. semaphore type, semaphore queueing method, tasks pended, and so forth.
  22. These routines are included automatically when the component INCLUDE_SM_OBJ
  23. is included.
  24. There are no user callable routines.
  25. AVAILABILITY
  26. This module is distributed as a component of the unbundled shared memory
  27. support option, VxMP.
  28. INCLUDE FILE: semSmLib.h
  29. SEE ALSO: semLib, semSmLib, smObjLib,
  30. tb VxWorks Programmer's Guide: Shared Memory Objects,
  31. tb VxWorks Programmer's Guide: Basic OS
  32. NOROUTINES
  33. */
  34. /* LINTLIBRARY */
  35. #include "vxWorks.h"
  36. #include "errno.h"
  37. #include "qFifoGLib.h"
  38. #include "smObjLib.h"
  39. #include "smMemLib.h"
  40. #include "semLib.h"
  41. #include "stdlib.h"
  42. #include "stdio.h"
  43. #include "string.h"
  44. #include "taskLib.h"
  45. #include "cacheLib.h"
  46. #include "intLib.h"
  47. #include "netinet/in.h"
  48. #include "private/semSmLibP.h"
  49. #include "private/smObjLibP.h"
  50. #include "private/windLibP.h"
  51. /*****************************************************************************
  52. *
  53. * semSmShowInit - initialize shared semaphores show routine
  54. *
  55. * This routine links the shared memory semaphores show routine into the
  56. * VxWorks system.
  57. *
  58. * RETURNS: N/A
  59. *
  60. * NOMANUAL
  61. */
  62. void semSmShowInit (void)
  63.     {
  64.     if (semLibInit () == OK)
  65. {
  66. /* 
  67.  * Initialize info and show routine pointer to allow semShow and 
  68.  * semInfo to handle shared semaphores ids.
  69.  */
  70. semSmShowRtn = (FUNCPTR) semSmShow;
  71. semSmInfoRtn = (FUNCPTR) semSmInfo;
  72. }
  73.     }
  74. /*****************************************************************************
  75. *
  76. * semSmInfo - get list of shared TCB that are blocked on shared semaphore
  77. *
  78. * This routine reports the shared task control block of tasks that are
  79. * blocked on a specified shared semaphore.
  80. * Up to <maxTasks> shared TCBs are copied to the array specified by <idList>.
  81. * The array is unordered.
  82. *
  83. * WARNING:
  84. * There is no guarantee that all the tasks are still valid or that no new
  85. * tasks have blocked by the time semSmInfo() returns.
  86. * This routines locks interrupts while getting the list of pended
  87. * tasks thus increasing local CPU interupt latency.
  88. * This routine must be used for debug purpose only.
  89. *
  90. * RETURNS: The number of blocked tasks placed in <idList>.
  91. *
  92. * ERRNO: S_smObjLib_LOCK_TIMEOUT
  93. * SEE ALSO: semSmShow
  94. *
  95. * NOMANUAL
  96. */
  97. int semSmInfo
  98.     (
  99.     SM_SEM_ID smSemId,          /* shared semaphore to summarize */
  100.     int idList[],               /* array of shared tcb to be filled in */
  101.     int maxTasks                /* max tasks idList can accommodate */
  102.     )
  103.     {
  104.     Q_FIFO_G_HEAD      pendQ;   /* temporary queue to get info */
  105.     int                numBlk; /* current number of blocked tasks */
  106.     int                level;
  107.     SM_SEM_ID volatile smSemIdv = (SM_SEM_ID volatile) smSemId;
  108.     int                tmp;
  109.     kernelState = TRUE;                         /* KERNEL ENTER */
  110.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  111.     tmp = smSemIdv->verify;                     /* PCI bridge bug [SPR 68844]*/
  112.     if (SM_OBJ_VERIFY (smSemIdv) != OK) /* check semaphore */
  113.         {
  114.         windExit ();                            /* KERNEL EXIT */
  115.         return (ERROR);
  116.         }
  117.     /* ENTER LOCKED SECTION */
  118.     if (SM_OBJ_LOCK_TAKE (&smSemId->lock, &level) != OK)
  119.         {
  120.         smObjTimeoutLogMsg ("semInfo", (char *) &smSemId->lock);
  121.         return (ERROR);                         /* can't take lock */
  122.         }
  123.     /* initialize pseudo multi-way Queue */
  124.     pendQ.pLock   = NULL;                       /* we already have the lock */
  125.     pendQ.pFifoQ  = &smSemId->smPendQ;          /* address of actual queue */
  126.     pendQ.pQClass = qFifoGClassId;              /* global fifo multi way Q */
  127.     numBlk = Q_INFO (&pendQ, idList, maxTasks);
  128.     /* EXIT LOCKED SECTION */
  129.     SM_OBJ_LOCK_GIVE (&smSemId->lock, level);
  130.     windExit ();                                /* KERNEL EXIT */
  131.     return (numBlk);                            /* return blocked task count */
  132.     }
  133. /*****************************************************************************
  134. *
  135. * semSmShow - displays list of task blocked on a shared semaphore
  136. *
  137. * This routine displays the task IDs and CPU number of tasks
  138. * blocked on a specified shared binary or counting semaphore.
  139. *
  140. * WARNING:
  141. * There is no guarantee that all the tasks are still valid or that no new
  142. * tasks have blocked by the time semSmShow() returns.
  143. * Interrupts are locked while getting the list of tasks pending
  144. * on the shared semaphore.
  145. *
  146. * Informations will be displayed as follows:
  147. * cs
  148. *
  149. * Semaphore Id        : 0x585f2
  150. * Semaphore Type      : SHARED BINARY
  151. * Task Queuing        : PRIORITY
  152. * Pended Tasks        : 1
  153. * State               : EMPTY {Count if COUNTING}
  154. *
  155. * ce
  156. *
  157. * If <level> is 1, then more detailed information will be displayed.
  158. * If tasks are blocked on the queue, they will be displayed in the order
  159. * they will unblock as follows:
  160. *
  161. * cs
  162. *
  163. *    TID     CPU number shared TCB
  164. * ---------- ---------- ----------
  165. * 0xc7854        0      0xaa580
  166. * 0x97028        0      0xaa59c
  167. * 0x920a8        0      0xaa5b8
  168. * 0x8d128        0      0xaa5d4
  169. *
  170. * value = 4 = 0x4
  171. *
  172. * ce
  173. *
  174. * RETURNS: The number of blocked tasks, or ERROR if semaphore is not shared.
  175. *
  176. * SEE ALSO: semSmInfoGet
  177. * NOMANUAL
  178. */
  179. int semSmShow 
  180.     (
  181.     SM_SEM_ID smSemId, /* shared semaphore to display info on */
  182.     int       level /* 0 = summary, 1 = details */
  183.     )
  184.     {
  185.     SM_OBJ_TCB *       pSmObjTcb;      /* shared tcb */
  186.     int *              smObjTcbList;   /* shared tcb list */
  187.     int *              pList;          /* shared tcb list pointer */
  188.     int                numTasks;       /* current # of blocked tasks */
  189.     int                ix;
  190.     int                maxTasks = 100; /* absolute max# of tasks displayed */
  191.     SM_SEM_ID volatile smSemIdv = (SM_SEM_ID volatile) smSemId;
  192.     int                tmp;
  193.     char *             semTypeMsg [MAX_SEM_TYPE] =
  194.         {
  195.         "BINARY", "MUTEX", "COUNTING", "OLD",
  196. "SHARED BINARY", "SHARED COUNTING", "", ""
  197.         };
  198.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  199.     tmp = smSemIdv->verify;                     /* PCI bridge bug [SPR 68844]*/
  200.     if (SM_OBJ_VERIFY (smSemIdv) != OK)          /* check semaphore */
  201.         {
  202.         return (ERROR);
  203.         }
  204.     /* allocate shared tcb list */
  205.     smObjTcbList = (int *) malloc (maxTasks * sizeof (int));
  206.     if (smObjTcbList == NULL)
  207.         {
  208. return (ERROR);
  209.         }
  210.     /* get list of shared TCBs blocked on smSemId */
  211.     numTasks = semSmInfo (smSemId, smObjTcbList, maxTasks);
  212.     if (numTasks == ERROR)
  213. {
  214. free (smObjTcbList);
  215. return (ERROR);
  216. }
  217.     /* show summary information */
  218.     printf ("n");
  219.     printf ("%-20s: 0x%-10xn", "Semaphore Id", SM_OBJ_ADRS_TO_ID (smSemId));
  220.     printf ("%-20s: %-10sn", "Semaphore Type", 
  221.     semTypeMsg[ntohl (smSemId->objType)]);
  222.     printf ("%-20s: %-10sn", "Task Queuing", "FIFO");
  223.     printf ("%-20s: %-10dn", "Pended Tasks", numTasks);
  224.     switch (ntohl (smSemId->objType))
  225.         {
  226.         case SEM_TYPE_SM_BINARY:
  227.             if (smSemId->state.flag == htonl (SEM_EMPTY))
  228.                 {
  229.                 printf ("%-20s: %-10sn", "State", "EMPTY");
  230.                 }
  231.             else
  232.                 {
  233.                 printf ("%-20s: %-10sn", "State", "FULL");
  234.                 }
  235.             break;
  236.         case SEM_TYPE_SM_COUNTING:
  237.             printf ("%-20s: %-10dn", "Count", ntohl (smSemId->state.count));
  238.             break;
  239. default :
  240.     break;
  241. }
  242.     if (level == 0) /* no more info required */
  243.    {
  244. free (smObjTcbList);
  245. return (numTasks);
  246. }
  247.     /* print list of TCB and CPU number if required */
  248.     if (numTasks == 0)
  249. {
  250. free (smObjTcbList);
  251. printf ("nNo Pended Task.nn");
  252. return (numTasks);
  253. }
  254.     printf ("n");
  255.     printf ("   TID     CPU Number Shared TCBn");
  256.     printf ("---------- ---------- ----------n");
  257.     pList = smObjTcbList;  /* go to first shared TCB */
  258.     for (ix = 0; ix < numTasks; ix++)
  259. {
  260.         pSmObjTcb = (SM_OBJ_TCB *) *pList; /* get shared TCB */
  261. printf ("%#-10x    %2d      %#-10xn", ntohl ((int)pSmObjTcb->localTcb),
  262. ntohl (pSmObjTcb->ownerCpu), (int) pSmObjTcb);
  263. pList++; /* go to next shared TCB */
  264. }
  265.     
  266.     printf ("n");
  267.     free (smObjTcbList);
  268.     return (numTasks);
  269.     }