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

VxWorks

开发平台:

C/C++

  1. /* msgQDistShow - distributed message queue show routines (VxFusion option) */
  2. /* Copyright 1999-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01h,30oct01,jws  fix man pages (SPR 71239)
  7. 01g,24may99,drm  added vxfusion prefix to VxFusion related includes
  8. 01f,18feb99,wlf  doc cleanup
  9. 01e,17feb99,drm  Changing msgQDistShow to display node portion of unique ID
  10. 01d,29oct98,drm  documentation updates
  11. 01c,11aug98,drm  fixed group message queue display problem
  12. 01b,09may98,ur   removed 8 bit node id restriction
  13. 01a,02oct97,ur   written.
  14. */
  15. /*
  16. DESCRIPTION
  17. This library provides show routines for distributed message queues.  The
  18. user does not call these show routines directly.  Instead, he uses
  19. the msgQShow library routine msgQShow() to display the contents of a
  20. message queue, regardless of its type.  The msgQShow() routine calls the
  21. distributed show routines, as necessary.
  22. AVAILABILITY
  23. This module is distributed as a component of the unbundled distributed
  24. message queues option, VxFusion.
  25. INCLUDE FILES: msgQDistShow.h
  26. SEE ALSO: msgQDistLib, msgQShow
  27. */
  28. #include "vxWorks.h"
  29. #include "stdio.h"
  30. #include "errnoLib.h"
  31. #include "msgQLib.h"
  32. #include "vxfusion/msgQDistLib.h"
  33. #include "vxfusion/msgQDistGrpLib.h"
  34. #include "vxfusion/distNameLib.h"
  35. #include "vxfusion/distStatLib.h"
  36. #include "vxfusion/private/msgQDistLibP.h"
  37. #include "vxfusion/private/msgQDistGrpLibP.h"
  38. #include "vxfusion/private/distNodeLibP.h"
  39. /* local prototypes */
  40. LOCAL STATUS msgQDistShow (MSG_Q_ID msgQId, int level);
  41. LOCAL STATUS msgQDistInfoGet (MSG_Q_ID msgQId, MSG_Q_INFO *pInfo);
  42. /***************************************************************************
  43. *
  44. * msgQDistShowInit - initialize the distributed message queue show package (VxFusion option)
  45. *
  46. * This routine initializes the distributed message queue show package.
  47. *
  48. * NOTE: This routine is called automatically when a target boots using a 
  49. * VxWorks image with VxFusion installed and show routines enabled.
  50. *
  51. * AVAILABILITY
  52. * This routine is distributed as a component of the unbundled distributed
  53. * message queues option, VxFusion.
  54. *
  55. * RETURNS: N/A
  56. */
  57. void msgQDistShowInit (void)
  58.     {
  59.     msgQDistShowRtn       = (FUNCPTR) msgQDistShow;
  60.     msgQDistInfoGetRtn    = (FUNCPTR) msgQDistInfoGet;
  61.     }
  62. /***************************************************************************
  63. *
  64. * msgQDistShow - show information about a distributed message queue (VxFusion option)
  65. *
  66. * This routine prints information about a distributed message queue.
  67. *
  68. * AVAILABILITY
  69. * This routine is distributed as a component of the unbundled distributed
  70. * message queues option, VxFusion.
  71. *
  72. * RETURNS: OK, unless <msgQId> is invalid.
  73. *
  74. * ERRNO: S_distLib_OBJ_ID_ERROR
  75. *
  76. * NOMANUAL
  77. */
  78. LOCAL STATUS msgQDistShow
  79.     (
  80.     MSG_Q_ID    msgQId,        /* message queue to display */
  81.     int         level          /* 0 = summary, 1 = details */
  82.     )
  83.     {
  84.     DIST_MSG_Q_ID    dMsgQId;
  85.     DIST_OBJ_NODE *  pObjNode;
  86.     BOOL             msgQHasName = FALSE;
  87.     char             nameMsgQ[DIST_NAME_MAX_LENGTH + 1];
  88.     if (DIST_OBJ_VERIFY (msgQId) == ERROR)
  89.         {
  90.         errnoSet (S_distLib_OBJ_ID_ERROR);
  91.         return (ERROR);
  92.         }
  93.     pObjNode = MSG_Q_ID_TO_DIST_OBJ_NODE (msgQId);
  94.     if (! IS_DIST_MSG_Q_OBJ (pObjNode))
  95.         {
  96.         errnoSet (S_distLib_OBJ_ID_ERROR);
  97.         return (ERROR); /* legal object id, but not a message queue */
  98.         }
  99.     if (distNameFindByValueAndType (&msgQId, T_DIST_MSG_Q,
  100.             (char *) &nameMsgQ, NO_WAIT) == OK)
  101.         msgQHasName = TRUE;
  102.     printf ("Message Queue Id    : 0x%lx", (u_long) msgQId);
  103.     if (msgQHasName)
  104.         printf (" ("%s")n", nameMsgQ);
  105.     else
  106.         printf (" (not in name db)n");
  107.     dMsgQId = (DIST_MSG_Q_ID) pObjNode->objNodeId;
  108.     if (IS_DIST_MSG_Q_TYPE_GRP (dMsgQId))
  109.         {
  110.         /* group */
  111.         
  112.         DIST_MSG_Q_GRP_ID    distGrpId;
  113.         DIST_GRP_DB_NODE *   pNode;
  114.         char *               state;
  115.         printf ("Global unique Id    : 0x%lxn", (u_long) dMsgQId);
  116.         printf ("Type                : groupn");
  117.         distGrpId = DIST_MSG_Q_ID_TO_DIST_MSG_Q_GRP_ID (dMsgQId);
  118.         pNode = msgQDistGrpLclFindById (distGrpId);
  119.         printf ("Group Name          : "%s"n",
  120.                 (char *) &(pNode->grpDbName));
  121.         switch (pNode->grpDbState)
  122.             {
  123.             case DIST_GRP_STATE_LOCAL_TRY:
  124.                 state = "try";
  125.                 break;
  126.             case DIST_GRP_STATE_WAIT:
  127.                 state = "wait";
  128.                 break;
  129.             case DIST_GRP_STATE_WAIT_TRY:
  130.                 state = "retry";
  131.                 break;
  132.             case DIST_GRP_STATE_GLOBAL:
  133.                 {
  134.                 DIST_NODE_ID    nodeIdCreator = pNode->grpDbNodeId;
  135.                 BOOL            creatorHasName = FALSE;
  136.                 char            nameCreator[DIST_NAME_MAX_LENGTH + 1];
  137.                 if (distNameFindByValueAndType (&nodeIdCreator, T_DIST_NODE,
  138.                         (char *) &nameCreator, NO_WAIT) == OK)
  139.                     creatorHasName = TRUE;
  140.                 printf ("Creating Node       : 0x%08lx",
  141.                         (u_long) nodeIdCreator);
  142.                 if (creatorHasName)
  143.                     printf (" ("%s")n", nameCreator);
  144.                 else
  145.                     printf (" (not in name db)n");
  146.                 state = "global";
  147.                 break;
  148.                 }
  149.             default:
  150.                 state = "unknown";
  151.             }
  152.         printf ("State               : %sn", state);
  153.         }
  154.     else
  155.         {
  156.         /*  queue */
  157.         
  158.         DIST_NODE_ID    nodeIdHome;
  159.         BOOL            homeHasName = FALSE;
  160.         char            nameHome[DIST_NAME_MAX_LENGTH + 1];
  161.         char *          type;
  162.         nodeIdHome = pObjNode->objNodeReside;
  163.         printf ("Global unique Id    : 0x%lx:%lxn", (u_long) nodeIdHome,
  164.                 (u_long) dMsgQId);
  165.         if (nodeIdHome == distNodeLocalGetId())
  166.             type = "queue";
  167.         else
  168.             type = "remote queue";
  169.         printf ("Type                : %sn", type);
  170.         if (distNameFindByValueAndType (&nodeIdHome, T_DIST_NODE,
  171.                 (char *) &nameHome, NO_WAIT) == OK)
  172.             homeHasName = TRUE;
  173.         printf ("Home Node           : 0x%08lx",
  174.                 (u_long) nodeIdHome);
  175.         if (homeHasName)
  176.             printf (" ("%s")n", nameHome);
  177.         else
  178.             printf (" (not in name db)n");
  179.         if (nodeIdHome == distNodeLocalGetId())
  180.             {
  181.             MSG_Q_ID    mapped = msgQDistGetMapped (msgQId);
  182.             printf ("Mapped to           : 0x%lxn", (u_long) mapped);
  183.             if (msgQShow (mapped, level) == ERROR)
  184.                 return (ERROR);
  185.             }
  186.         }
  187.     return (OK);
  188.     }
  189. /***************************************************************************
  190. *
  191. * msgQDistInfoGet - get information about a distributed message queue (VxFusion option)
  192. *
  193. * This routine currently does nothing.
  194. *
  195. * AVAILABILITY
  196. * This routine is distributed as a component of the unbundled distributed
  197. * message queues option, VxFusion.
  198. *
  199. * RETURNS: OK, unless <msgQId> is invalid.
  200. *
  201. * NOMANUAL
  202. */
  203. LOCAL STATUS msgQDistInfoGet
  204.     (
  205.     MSG_Q_ID       msgQId,      /* message queue to query */
  206.     MSG_Q_INFO *   pInfo        /* where to return msg info */
  207.     )
  208.     {
  209.     MSG_Q_ID    mappedQId;
  210.     if ((mappedQId = msgQDistGetMapped (msgQId)) == NULL)
  211.         return ERROR;
  212.     return (msgQInfoGet (mappedQId, pInfo));
  213.     }