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

VxWorks

开发平台:

C/C++

  1. /* semShow.c - semaphore show routines */
  2. /* Copyright 1990-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01q,31oct01,aeg  added display of VxWorks events information.
  8. 01p,26sep01,jws  move vxMP show & info rtn ptrs to funcBind.c (SPR36055)
  9. 01o,18dec00,pes  Correct compiler warnings
  10. 01n,17mar99,jdi  doc: updated w/ info about proj facility (SPR 25727).
  11. 01m,24jun96,sbs  made windview instrumentation conditionally compiled
  12. 01l,10oct95,jdi  doc: added .tG Shell to SEE ALSO for semShow().
  13. 01l,16jan94,c_s  semShowInit () now initializes instrumented class.
  14. 01k,03feb93,jdi  changed INCLUDE_SHOW_RTNS to ...ROUTINES.
  15. 01j,02feb93,jdi  documentation tweaks.
  16. 01i,23nov92,jdi  documentation cleanup.
  17. 01h,13nov92,dnw  added include of smObjLib.h
  18. 01g,30jul92,smb  changed format for printf to avoid zero padding.
  19. 01f,29jul92,pme  added NULL function pointer check for smObj routines.
  20. 01e,28jul92,jcf  changed semShowInit to call semLibInit.
  21. 01d,19jul92,pme  added shared memory semaphores support.
  22. 01c,12jul92,jcf  changed level compare to >=
  23. 01b,07jul92,ajm  changed semTypeMsg to be static
  24. 01a,15jun92,jcf  extracted from v1l of semLib.c.
  25. */
  26. /*
  27. DESCRIPTION
  28. This library provides routines to show semaphore statistics, such as
  29. semaphore type, semaphore queuing method, tasks pended, etc.
  30. The routine semShowInit() links the semaphore show facility into the VxWorks
  31. system.  It is called automatically when the semaphore show facility is
  32. configured into VxWorks using either of the following methods:
  33. .iP
  34. If you use the configuration header files, define
  35. INCLUDE_SHOW_ROUTINES in config.h.
  36. .iP
  37. If you use the Tornado project facility, select INCLUDE_SEM_SHOW.
  38. .LP
  39. INCLUDE FILES: semLib.h
  40. SEE ALSO: semLib,
  41. .pG "Basic OS"
  42. */
  43. /* LINTLIBRARY */
  44. #include "vxWorks.h"
  45. #include "intLib.h"
  46. #include "qLib.h"
  47. #include "errno.h"
  48. #include "stdlib.h"
  49. #include "stdarg.h"
  50. #include "string.h"
  51. #include "stdio.h"
  52. #include "smObjLib.h"
  53. #include "private/eventLibP.h"
  54. #include "private/semLibP.h"
  55. #include "private/kernelLibP.h"
  56. #include "private/taskLibP.h"
  57. #include "private/semSmLibP.h"
  58. /* globals */
  59. /* locals */
  60. LOCAL char *  semTypeMsg [MAX_SEM_TYPE] = 
  61.     {
  62.     "BINARY", "MUTEX", "COUNTING", "OLD", "", "", "", ""
  63.     };
  64. /******************************************************************************
  65. *
  66. * semShowInit - initialize the semaphore show facility
  67. *
  68. * This routine links the semaphore show facility into the VxWorks system.
  69. * It is called automatically when the semaphore show facility is
  70. * configured into VxWorks using either of the following methods:
  71. * .iP
  72. * If you use the configuration header files, define
  73. * INCLUDE_SHOW_ROUTINES in config.h.
  74. * .iP
  75. * If you use the Tornado project facility, select INCLUDE_SEM_SHOW.
  76. *
  77. * RETURNS: N/A
  78. */
  79. void semShowInit (void)
  80.     {
  81.     if (semLibInit () == OK)
  82. {
  83. classShowConnect (semClassId, (FUNCPTR)semShow);
  84. #ifdef WV_INSTRUMENTATION
  85. classShowConnect (semInstClassId, (FUNCPTR)semShow);
  86. #endif
  87. }
  88.     }
  89. /*******************************************************************************
  90. *
  91. * semInfo - get a list of task IDs that are blocked on a semaphore
  92. *
  93. * This routine reports the tasks blocked on a specified semaphore.
  94. * Up to <maxTasks> task IDs are copied to the array specified by <idList>.
  95. * The array is unordered.
  96. *
  97. * WARNING:
  98. * There is no guarantee that all listed tasks are still valid or that new
  99. * tasks have not been blocked by the time semInfo() returns.
  100. *
  101. * RETURNS: The number of blocked tasks placed in <idList>.
  102. */
  103. int semInfo
  104.     (
  105.     SEM_ID semId,               /* semaphore ID to summarize */
  106.     int idList[],               /* array of task IDs to be filled in */
  107.     int maxTasks                /* max tasks idList can accommodate */
  108.     )
  109.     {
  110.     int       numBlk;
  111.     int       lock;
  112.     if (INT_RESTRICT () != OK) /* restrict ISR use */
  113. return (ERROR);
  114.     if (ID_IS_SHARED (semId))            /* semaphore is shared */
  115.         {
  116.         if (semSmInfoRtn == NULL)
  117.             {
  118.             errno = S_smObjLib_NOT_INITIALIZED;
  119.             return (ERROR);
  120.             }
  121.         return ((* semSmInfoRtn) (SM_OBJ_ID_TO_ADRS (semId), idList, maxTasks));
  122. }
  123.     lock = intLock (); /* LOCK INTERRUPTS */
  124.     if (OBJ_VERIFY (semId, semClassId) != OK)
  125. {
  126. intUnlock (lock); /* UNLOCK INTERRUPTS */
  127. return (ERROR);
  128. }
  129.     numBlk = Q_INFO (&semId->qHead, idList, maxTasks);
  130.     intUnlock (lock); /* UNLOCK INTERRUPTS */
  131.     return (numBlk); /* return blocked task count */
  132.     }
  133. /*******************************************************************************
  134. *
  135. * semShow - show information about a semaphore
  136. *
  137. * This routine displays the state and optionally the pended tasks of a 
  138. * semaphore.
  139. *
  140. * A summary of the state of the semaphore is displayed as follows:
  141. * .CS
  142. *     Semaphore Id        : 0x585f2
  143. *     Semaphore Type      : BINARY
  144. *     Task Queuing        : PRIORITY
  145. *     Pended Tasks        : 1
  146. *     State               : EMPTY {Count if COUNTING, Owner if MUTEX}
  147. *     Options             : 0x1       SEM_Q_PRIORITY
  148. *
  149. *     VxWorks Events
  150. *     --------------
  151. *     Registered Task     : 0x594f0 (t1)
  152. *     Event(s) to Send    : 0x1
  153. *     Options             : 0x7       EVENTS_SEND_ONCE
  154. *                                     EVENTS_ALLOW_OVERWRITE
  155. *                                     EVENTS_SEND_IF_FREE
  156. * .CE
  157. *
  158. * If <level> is 1, then more detailed information will be displayed.
  159. * If tasks are blocked on the queue, they are displayed in the order
  160. * in which they will unblock, as follows:
  161. * .CS
  162. *     Pended Tasks
  163. *     ------------
  164. *        NAME      TID    PRI DELAY
  165. *     ---------- -------- --- -----
  166. *     tExcTask    3fd678   0    21
  167. *     tLogTask    3f8ac0   0   611
  168. * .CE
  169. *
  170. * RETURNS: OK or ERROR.
  171. *
  172. * SEE ALSO:
  173. * .pG "Target Shell,"
  174. * windsh,
  175. * .tG "Shell"
  176. */
  177. STATUS semShow
  178.     (
  179.     SEM_ID semId, /* semaphore to display */
  180.     int level /* 0 = summary, 1 = details */
  181.     )
  182.     {
  183.     int taskIdList [20];
  184.     int taskDList [20];
  185.     int   numTasks;
  186.     WIND_TCB * pTcb;
  187.     char * qMsg;
  188.     int         ix;
  189.     int   lock;
  190.     char optionsString [128];
  191.     EVENTS_RSRC semEvResource;
  192.     if (ID_IS_SHARED (semId))            /* semaphore is shared */
  193.         {
  194.         if (semSmShowRtn == NULL)
  195.             {
  196.             errno = S_smObjLib_NOT_INITIALIZED;
  197.             return (ERROR);
  198.             }
  199.         return ((*semSmShowRtn) ((SM_SEM_ID) SM_OBJ_ID_TO_ADRS (semId), level));
  200. }
  201.     lock = intLock (); /* LOCK INTERRUPTS */
  202.     if ((numTasks = semInfo (semId, &taskIdList[0], 20)) == ERROR)
  203. {
  204. intUnlock (lock); /* UNLOCK INTERRUPTS */
  205. printf ("Invalid semaphore id: %#xn", (int)semId);
  206. return (ERROR);
  207. }
  208.     if (numTasks > 0) /* record delays */
  209. {
  210. for (ix = 0; ix < min (numTasks, NELEMENTS (taskIdList)); ix++)
  211.     {
  212.     pTcb = (WIND_TCB *)(taskIdList [ix]);
  213.     if (pTcb->status & WIND_DELAY)
  214. taskDList[ix] = Q_KEY (&tickQHead, &pTcb->tickNode, 1);
  215.     else
  216. taskDList[ix] = 0;
  217.     }
  218. }
  219.     pTcb          = semId->semOwner; /* record owner/count */
  220.     semEvResource = semId->events; /* record event info */
  221.     intUnlock (lock); /* UNLOCK INTERRUPTS */
  222.     qMsg = ((semId->options & SEM_Q_MASK) == SEM_Q_FIFO) ? "FIFO" : "PRIORITY";
  223.     /* show summary information */
  224.     printf ("n");
  225.     printf ("%-20s: 0x%-10xn", "Semaphore Id", (int)semId);
  226.     printf ("%-20s: %-10sn", "Semaphore Type", semTypeMsg[semId->semType]);
  227.     printf ("%-20s: %-10sn", "Task Queuing", qMsg);
  228.     printf ("%-20s: %-10dn", "Pended Tasks", numTasks);
  229.     /* start generating semaphore options string */
  230.     if ((semId->options & SEM_Q_MASK) == SEM_Q_FIFO)
  231. strcpy (optionsString, "SEM_Q_FIFOn");
  232.     else
  233. strcpy (optionsString, "SEM_Q_PRIORITYn");
  234.     switch (semId->semType)
  235. {
  236. case SEM_TYPE_BINARY:
  237.     if (pTcb != NULL)
  238. printf ("%-20s: %-10sn", "State", "EMPTY");
  239.     else
  240. printf ("%-20s: %-10sn", "State", "FULL");
  241.     break;
  242. case SEM_TYPE_COUNTING:
  243.     printf ("%-20s: %-10dn", "Count", (int)pTcb);
  244.     break;
  245. case SEM_TYPE_MUTEX:
  246.     if (pTcb != NULL)
  247. {
  248. printf ("%-20s: 0x%-10x", "Owner", (int)pTcb);
  249. if (taskIdVerify ((int)pTcb) != OK)
  250.     printf (" Deleted!n");
  251. else if (pTcb->name != NULL)
  252.     printf (" (%s)n", pTcb->name);
  253. else
  254.     printf ("n");
  255. }
  256.     else
  257. printf ("%-20s: %-10sn", "Owner", "NONE");
  258.     /* continue generating semaphore options string */
  259.     if ((semId->options & SEM_DELETE_SAFE) != 0)
  260. strcat (optionsString, "ttttSEM_DELETE_SAFEn");
  261.     if ((semId->options & SEM_INVERSION_SAFE) != 0)
  262. strcat (optionsString, "ttttSEM_INVERSION_SAFEn");
  263.     break;
  264. default :
  265.     printf ("%-20s: 0x%-10xn", "State", (int)pTcb);
  266.     break;
  267. }
  268.     /* complete generating semaphore options string */
  269.     if ((semId->options & SEM_EVENTSEND_ERR_NOTIFY) != 0)
  270. strcat (optionsString, "ttttSEM_EVENTSEND_ERR_NOTIFYn");
  271.     printf ("%-20s: 0x%xt%s", "Options", semId->options, optionsString);
  272.     /* display VxWorks events information */
  273.     eventRsrcShow (&semEvResource);
  274.     if (level >= 1)   /* show blocked tasks */
  275. {
  276. if (numTasks > 0)
  277.     {
  278.     printf ("nPended Tasksn------------n"
  279.     "   NAME      TID    PRI TIMEOUTn"
  280.     "---------- -------- --- -------n");
  281.     for (ix = 0; ix < min (numTasks, NELEMENTS (taskIdList)); ix++)
  282. printf ("%-11s%8x %3d %7un", 
  283. taskName (taskIdList [ix]),
  284. taskIdList [ix],
  285. ((WIND_TCB *)taskIdList [ix])->priority,
  286. taskDList[ix]);
  287.     }
  288. }
  289.     printf ("n");
  290.     return (OK);
  291.     }