msgQDistGrpShow.c
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:8k
开发平台:

MultiPlatform

  1. /* msgQDistGrpShow.c - distributed message queue group show routines (VxFusion option) */
  2. /* Copyright 1999 - 2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01i,23oct01,jws  fix compiler warnings (SPR 71117); fix man pages (SPR 71239)
  7. 01h,24may99,drm  added vxfusion prefix to VxFusion related includes
  8. 01g,23feb99,wlf  doc edits
  9. 01f,19feb99,wlf  update output example
  10. 01e,18feb99,wlf  doc cleanup
  11. 01d,29oct98,drm  documentation update
  12. 01c,20may98,drm  removed some warning messages by initializing pointers to NULL
  13. 01b,30mar98,ur   set errno when group not found.
  14. 01a,09jul97,ur   written.
  15. */
  16. /*
  17. DESCRIPTION
  18. This library provides a routine to show either the contents of the entire 
  19. message queue group database or the contents of single message queue group.
  20. AVAILABILITY
  21. This module is distributed as a component of the unbundled distributed
  22. message queues option, VxFusion.
  23. INCLUDE FILES: msgQDistGrpShow.h
  24. SEE ALSO: msgQDistGrpLib
  25. */
  26. #include <vxWorks.h>
  27. #include <stdio.h>
  28. #include <errnoLib.h>
  29. #include <sllLib.h>
  30. #include <hashLib.h>
  31. #include <msgQLib.h>
  32. #include <vxfusion/msgQDistGrpLib.h>
  33. #include <vxfusion/msgQDistGrpShow.h>
  34. #include <vxfusion/private/msgQDistGrpLibP.h>
  35. /* defines */
  36. #define UNUSED_ARG(x)  if(sizeof(x)) {} /* to suppress compiler warnings */
  37. /* forward declarations */
  38. LOCAL void msgQDistGrpNodeShow (DIST_GRP_DB_NODE *distGrpDbNode);
  39. LOCAL BOOL msgQDistGrpShowEach (DIST_GRP_HASH_NODE *pNode, int dummy);
  40. /***************************************************************************
  41. *
  42. * msgQDistGrpShowInit - initialize group show module (VxFusion option)
  43. *
  44. * This routine currently does nothing.
  45. *
  46. * AVAILABILITY
  47. * This routine is distributed as a component of the unbundled distributed
  48. * message queues option, VxFusion.
  49. *
  50. * RETURNS: N/A
  51. *
  52. * NOMANUAL
  53. */
  54. void msgQDistGrpShowInit (void)
  55.     {
  56.     }
  57. /***************************************************************************
  58. *
  59. * msgQDistGrpShow - display all or one group with its members (VxFusion option)
  60. *
  61. * This routine displays either all distributed message queue groups 
  62. * or a specified group in the group database.  For each group displayed on the
  63. * node, this routine lists only members added (using msgQDistGrpAdd()) from the
  64. * node executing the msgQDistGrpShow() call.  
  65. * If <distGrpName> is NULL, all groups and their locally added
  66. * members are displayed.  Otherwise, only the group specified by 
  67. * <distGrpName> and its locally added members are displayed.
  68. *
  69. * NOTE: The concept of "locally added" is an important one.  All nodes in the 
  70. * system can add groups to a message queue group.  However, only those message
  71. * queues (including remote distributed message queues) that were added to 
  72. * the group from the local node are displayed by this routine.
  73. *
  74. * EXAMPLE:
  75. * cs
  76. -> msgQDistGrpShow(0)
  77. * NAME OF GROUP         GROUP ID   STATE  MEMBER ID TYPE OF MEMBER
  78. * ------------------- ---------- ------- ---------- ---------------------------
  79. * grp1                  0x3ff9e3  global   0x3ff98b distributed msg queue
  80. *                                          0x3ff9fb distributed msg queue
  81. * grp2                  0x3ff933  global   0x3ff89b distributed msg queue
  82. *                                          0x3ff8db distributed msg queue
  83. *                                          0x3ff94b distributed msg queue
  84. * value = 0 = 0x0
  85. * ce
  86. *
  87. * AVAILABILITY
  88. * This routine is distributed as a component of the unbundled distributed
  89. * message queues option, VxFusion.
  90. *
  91. * RETURNS: OK, unless name not found.
  92. *
  93. * ERRNO:
  94. * is
  95. * i S_msgQDistGrpLib_NO_MATCH
  96. * The group name was not found in the database.
  97. * ie
  98. *
  99. */
  100. STATUS msgQDistGrpShow
  101.     (
  102.     char * distGrpName  /* name of the group to display or NULL for all */
  103.     )
  104.     {
  105.     DIST_GRP_DB_NODE * distGrpDbNode = NULL;
  106.     if (distGrpName != NULL &&
  107.         (distGrpDbNode = msgQDistGrpLclFindByName (distGrpName)) == NULL)
  108.         {
  109.         errnoSet (S_msgQDistGrpLib_NO_MATCH);
  110.         return (ERROR);
  111.         }
  112.     printf ("NAME OF GROUP         GROUP ID   STATE  MEMBER ID ");
  113.     printf ("TYPE OF MEMBERn");
  114.     printf ("------------------- ---------- ------- ---------- ");
  115.     printf ("-----------------------------n");
  116.     if (distGrpName != NULL)
  117.         msgQDistGrpNodeShow (distGrpDbNode);
  118.     else
  119.         msgQDistGrpLclEach (msgQDistGrpShowEach, 0);
  120.     return (OK);
  121.     }
  122. /***************************************************************************
  123. *
  124. * msgQDistGrpShowEach - helper for msgQDistGrpShow (VxFusion option)
  125. *
  126. * This routine prints information about a group node given the group
  127. * hash node.
  128. *
  129. * AVAILABILITY
  130. * This routine is distributed as a component of the unbundled distributed
  131. * message queues option, VxFusion.
  132. *
  133. * RETURNS: TRUE.
  134. *
  135. * NOMANUAL
  136. */
  137. LOCAL BOOL msgQDistGrpShowEach
  138.     (
  139.     DIST_GRP_HASH_NODE *  pDistGrpHashNode,   /* group hash node */
  140.     int                   dummy               /* unused argument */
  141.     )
  142.     {
  143.     
  144.     UNUSED_ARG(dummy);    
  145.     
  146.     msgQDistGrpNodeShow (pDistGrpHashNode->pDbNode);
  147.     return (TRUE);
  148.     }
  149. /***************************************************************************
  150. *
  151. * msgQDistGrpNodeShow - print informations from struct DIST_GRP_DB_NODE (VxFusion option)
  152. *
  153. * This routine prints information about a group node.
  154. *
  155. * AVAILABILITY
  156. * This routine is distributed as a component of the unbundled distributed
  157. * message queues option, VxFusion.
  158. *
  159. * RETURNS: N/A
  160. *
  161. * NOMANUAL
  162. */
  163. LOCAL void msgQDistGrpNodeShow
  164.     (
  165.     DIST_GRP_DB_NODE * pDistGrpDbNode   /* node for which to display info */
  166.     )
  167.     {
  168.     SL_NODE *       pNode;
  169.     MSG_Q_ID        msgQId;
  170.     char *          state;
  171.     DIST_MSG_Q_ID   dMsgQId;
  172.     DIST_OBJ_ID     dObjId;
  173. #ifdef UNDEFINED    /* apparently not used */
  174.     DIST_MSG_Q_GRP_ID_TO_DIST_MSG_Q_ID (pDistGrpDbNode->grpDbId);
  175. #endif
  176.     printf ("%-19s %10p ", pDistGrpDbNode->grpDbName,
  177.             pDistGrpDbNode->grpDbMsgQId);
  178.     switch (pDistGrpDbNode->grpDbState)
  179.         {
  180.         case DIST_GRP_STATE_LOCAL_TRY:
  181.             state = "lcl try";
  182.             break;
  183.         case DIST_GRP_STATE_REMOTE_TRY:
  184.             state = "rmt try";
  185.             break;
  186.         case DIST_GRP_STATE_WAIT:
  187.             state = "wait";
  188.             break;
  189.         case DIST_GRP_STATE_WAIT_TRY:
  190.             state = "retry";
  191.             break;
  192.         case DIST_GRP_STATE_GLOBAL:
  193.             state = "global";
  194.             break;
  195.         default:
  196.             state = "unknown";
  197.         }
  198.     printf ("%7s ", state);
  199.     pNode = SLL_FIRST ((SL_LIST *) &pDistGrpDbNode->grpDbMsgQIdLst);
  200.     if (pNode == NULL)
  201.         {
  202.         printf ("--no local member in this group--n");
  203.         return;
  204.         }
  205.     FOREVER
  206.         {
  207.         msgQId = ((DIST_GRP_MSG_Q_NODE *) pNode)->msgQId;
  208.         printf ("%10p ", msgQId);
  209.         switch (((uint32_t) msgQId) & VX_TYPE_OBJ_MASK)
  210.             {
  211.             case VX_TYPE_DIST_OBJ:
  212.                 dObjId = (MSG_Q_ID_TO_DIST_OBJ_NODE (msgQId))->objNodeId;
  213.                 dMsgQId = DIST_OBJ_ID_TO_DIST_MSG_Q_ID (dObjId);
  214.                 if (IS_DIST_MSG_Q_TYPE_GRP (dMsgQId))
  215.                     printf ("distributed msg queue group");
  216.                 else
  217.                     printf ("distributed msg queue");
  218.                 break;
  219.             case VX_TYPE_SM_OBJ:
  220.                 printf ("shared memory msg queue");
  221.                 break;
  222.             case VX_TYPE_STD_OBJ:
  223.                 printf ("local msg queue");
  224.                 break;
  225.             default:
  226.                 printf ("unknown");
  227.                 break;
  228.             }
  229.         if ((pNode = SLL_NEXT (pNode)) == NULL)
  230.             {
  231.             printf ("n");
  232.             break;
  233.             }
  234.         else
  235.             printf ("n                                       ");
  236.         }
  237.     }