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

VxWorks

开发平台:

C/C++

  1. /* msgQDistLibP.h - distributed message queue library private hdr (VxFusion) */
  2. /* Copyright 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,24may99,drm  added vxfusion prefix to VxFusion related includes
  7. 01d,19feb99,drm  added remoteError member to send/receive _INQ packets
  8. 01c,21may98,drm  removed redundant #include statement
  9. 01b,08may98,ur   removed 8 bit node id restriction
  10. 01a,06jun97,ur   written
  11. */
  12. #ifndef __INCmsgQDistLibPh
  13. #define __INCmsgQDistLibPh
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. #include "vxWorks.h"
  18. #include "sllLib.h"
  19. #include "msgQLib.h"
  20. #include "private/semLibP.h"
  21. #include "vxfusion/private/distNodeLibP.h"
  22. #include "vxfusion/private/distPktLibP.h"
  23. #include "vxfusion/private/distObjLibP.h"
  24. /* defines */
  25. #define msgQDistTblLock() semTake(&msgQDistTblLock, WAIT_FOREVER)
  26. #define msgQDistTblUnlock() semGive(&msgQDistTblLock)
  27. #define IS_DIST_MSG_Q_OBJ(pObjNode) 
  28. ((pObjNode)->objNodeType == DIST_OBJ_TYPE_MSG_Q)
  29. /* DIST_MSG_Q_ID looks like this: |----tblIx-or-grpId----|-type-| */
  30. #define DIST_MSG_Q_TYPE_SHIFT 1
  31. #define DIST_MSG_Q_TYPE_MSG_Q 0x0 /* message queue */
  32. #define DIST_MSG_Q_TYPE_MSG_Q_GRP 0x1 /* message queue group */
  33. #define IS_DIST_MSG_Q_TYPE_GRP(distMsgQId) 
  34. (((distMsgQId) & ((1 << DIST_MSG_Q_TYPE_SHIFT) - 1)) == 
  35.  DIST_MSG_Q_TYPE_MSG_Q_GRP)
  36. /* message queue service */
  37. #define DIST_MSG_Q_SERV_NAME "tServMsgQ"
  38. #define DIST_MSG_Q_SERV_TASK_PRIO 50
  39. #define DIST_MSG_Q_SERV_TASK_STACK_SZ 5000
  40. #define DIST_MSG_Q_SERV_NET_PRIO 0
  41. #define DIST_MSG_Q_WAIT_TASK_PRIO 50
  42. #define DIST_MSG_Q_WAIT_TASK_STACK_SZ 5000
  43. /* priority stuff */
  44. #define DIST_MSG_PRI_MASK (0x07)
  45. #define DIST_MSG_Q_PRIO_VERIFY(msgQPrio) 
  46. (((msgQPrio) == MSG_PRI_URGENT) || 
  47.  ((msgQPrio) == MSG_PRI_NORMAL) || 
  48.  (((msgQPrio) >= DIST_MSG_PRI_0) && ((msgQPrio) <= DIST_MSG_PRI_7)))
  49. #define DIST_MSG_Q_PRIO_TO_NET_PRIO(msgQPrio) 
  50. (((msgQPrio) == MSG_PRI_URGENT) ? 
  51. ((int) (DIST_MSG_PRI_0 & DIST_MSG_PRI_MASK)) : 
  52.  ((msgQPrio) == MSG_PRI_NORMAL) ? 
  53. ((int) (DIST_MSG_PRI_4 & DIST_MSG_PRI_MASK)) : 
  54.  ((int) ((msgQPrio) & DIST_MSG_PRI_MASK)))
  55. #define DIST_MSG_Q_PRIO_TO_MSG_Q_PRIO(msgQPrio) 
  56. (((msgQPrio) == MSG_PRI_URGENT) ? MSG_PRI_URGENT : 
  57.  ((msgQPrio) == MSG_PRI_NORMAL) ? MSG_PRI_NORMAL : 
  58.  (((msgQPrio) <= DIST_MSG_PRI_3) ?  MSG_PRI_URGENT : MSG_PRI_NORMAL))
  59. #define NET_PRIO_TO_DIST_MSG_Q_PRIO(netPrio) 
  60. (((netPrio) <= 3) ?  MSG_PRI_URGENT : MSG_PRI_NORMAL)
  61. /* packet subtypes of DIST_PKT_TYPE_MSG_Q */
  62. #define DIST_PKT_TYPE_MSG_Q_SEND 0 /* send a message */
  63. #define DIST_PKT_TYPE_MSG_Q_RECV_REQ 1 /* ask for a message */
  64. #define DIST_PKT_TYPE_MSG_Q_RECV_RPL 2 /* return message */
  65. #define DIST_PKT_TYPE_MSG_Q_NUM_MSGS_REQ 3 /* ask for num messages */
  66. #define DIST_PKT_TYPE_MSG_Q_NUM_MSGS_RPL 4 /* reply with num messages */
  67. #define DIST_PKT_TYPE_MSG_Q_STATUS 64 /* status */
  68. #define DIST_MSG_Q_INQ_TYPE_NUM_MSGS ((0 << 8) | DIST_MSG_Q_INQ)
  69. #define DIST_MSG_Q_INQ_TYPE_RECV ((1 << 8) | DIST_MSG_Q_INQ)
  70. #define DIST_MSG_Q_INQ_TYPE_SEND ((2 << 8) | DIST_MSG_Q_INQ)
  71. #define MSG_Q_DIST_STATUS_OK OK /* OK--no error */
  72. #define MSG_Q_DIST_STATUS_ERROR 1 /* general error */
  73. #define MSG_Q_DIST_STATUS_TIMEOUT 2 /* timeout */
  74. #define MSG_Q_DIST_STATUS_UNAVAIL 3 /* message unavailable */
  75. #define MSG_Q_DIST_STATUS_UNREACH 4 /* remote node is unreachable */
  76. #define MSG_Q_DIST_STATUS_ILLEGAL_OBJ_ID 5 /* illegal object id */
  77. #define MSG_Q_DIST_STATUS_NOT_ENOUGH_MEMORY 6 /* out of memory */
  78. #define MSG_Q_DIST_STATUS_INTERNAL_ERROR 7 /* internal error */
  79. #define MSG_Q_DIST_STATUS_PROTOCOL_ERROR 8 /* protocol error */
  80. #define MSG_Q_DIST_STATUS_LOCAL_TIMEOUT 9 /* local timeout */
  81. #define DIST_MSG_Q_NUM_MSGS_PRIO (servTable[DIST_ID_MSG_Q_SERV].servNetPrio)
  82. #define DIST_MSG_Q_RECV_PRIO (servTable[DIST_ID_MSG_Q_SERV].servNetPrio)
  83. #define DIST_MSG_Q_ERROR_PRIO (servTable[DIST_ID_MSG_Q_SERV].servNetPrio)
  84. #define DIST_MSG_Q_TYPE_NBITS 1
  85. #define DIST_MSG_Q_TYPE_MASK 0x1L
  86. #define TYPE_DIST_MSG_Q 0L
  87. #define TYPE_DIST_MSG_Q_GRP 1L
  88. /* maximum number of nodes on the net */
  89. #define DIST_MSG_Q_MAX_NODES_LOG2 8
  90. #define DIST_MSG_Q_MAX_NODES 256
  91. /* maximum number of local message queues */
  92. #define DIST_MSG_Q_MAX_QS_LOG2 8
  93. #define DIST_MSG_Q_MAX_QS 256
  94. /* size of table for local message queues */
  95. #define TBL_SIZE 64
  96. #if TBL_SIZE > DIST_MSG_Q_MAX_QS
  97. #error "Too many local message queues for underlying layer!"
  98. #endif
  99. /*
  100.  * MSG_Q_ID -> foo
  101.  */
  102. /* MSG_Q_ID -> DIST_OBJ_NODE */
  103. #define MSG_Q_ID_TO_DIST_OBJ_NODE(msgQId) 
  104. ((DIST_OBJ_NODE *) (((uint32_t) msgQId) & ~VX_TYPE_OBJ_MASK))
  105. /*
  106.  * DIST_OBJ_NODE -> foo
  107.  */
  108. /* DIST_OBJ_NODE -> MSG_Q_ID */
  109. #define DIST_OBJ_NODE_TO_MSG_Q_ID(pObjNode) 
  110. ((MSG_Q_ID) (((uint32_t) pObjNode) | VX_TYPE_DIST_OBJ))
  111. /*
  112.  * DIST_MSG_Q_ID -> foo
  113.  */
  114. /* DIST_MSG_Q_ID -> DIST_MSG_Q_GRP_ID */
  115. #define DIST_MSG_Q_ID_TO_DIST_MSG_Q_GRP_ID(distMsgQId) 
  116. ((DIST_MSG_Q_GRP_ID) ((distMsgQId) >> DIST_MSG_Q_TYPE_SHIFT))
  117. /* DIST_MSG_Q_ID -> TBL_IX */
  118. #define DIST_MSG_Q_ID_TO_TBL_IX(distMsgQId) 
  119. ((TBL_IX) ((distMsgQId) >> DIST_MSG_Q_TYPE_SHIFT))
  120. /*
  121.  * DIST_MSG_Q_GRP_ID -> foo
  122.  */
  123. /* DIST_MSG_Q_GRP_ID -> DIST_MSG_Q_ID */
  124. #define DIST_MSG_Q_GRP_ID_TO_DIST_MSG_Q_ID(distMsgQGrpId) 
  125. ((DIST_MSG_Q_ID) 
  126.  (((uint32_t) (distMsgQGrpId) << DIST_MSG_Q_TYPE_SHIFT) | 
  127.   DIST_MSG_Q_TYPE_MSG_Q_GRP))
  128. /*
  129.  * TBL_IX -> foo
  130.  */
  131. /* TBL_IX -> DIST_MSG_Q_ID */
  132. #define TBL_IX_TO_DIST_MSG_Q_ID(tblIx) 
  133. ((DIST_MSG_Q_ID) 
  134.  (((uint32_t) (tblIx) << DIST_MSG_Q_TYPE_SHIFT) | 
  135.   DIST_MSG_Q_TYPE_MSG_Q))
  136. /*
  137.  * IS_xxx
  138.  */
  139. /* typedefs and structures */
  140. typedef uint32_t DIST_MSG_Q_ID; /* DIST_MSG_Q_ID */
  141. typedef uint16_t DIST_MSG_Q_SNGL_ID; /* DIST_MSG_Q_SNGL_ID */
  142. typedef uint16_t DIST_MSG_Q_GRP_ID; /* DIST_MSG_Q_GRP_ID */
  143. typedef uint8_t TBL_IX; /* TBL_IX */
  144. typedef short DIST_MSG_Q_STATUS; /* DIST_MSG_Q_STATUS */
  145. typedef struct  /* TBL_NODE */
  146. {
  147. union
  148. {
  149. SL_NODE nxtFree;
  150. MSG_Q_ID msgQId;
  151. } tblNodeType;
  152. TBL_IX   tblIx;
  153. } TBL_NODE;
  154. #define tblNxtFree tblNodeType.nxtFree
  155. #define tblMsgQId tblNodeType.msgQId
  156. /*
  157.  * Header for a packet addressed to a remote message queue.
  158.  */
  159. typedef struct /* DIST_PKT_MSG_Q_SEND */
  160. {
  161. DIST_PKT sendHdr;
  162. uint32_t sendInqId;
  163. uint32_t sendTimeout;
  164. TBL_IX sendTblIx; /* uint8_t */
  165. __DIST_PKT_HDR_END__
  166. /* message follows */
  167. } DIST_PKT_MSG_Q_SEND;
  168. typedef struct /* DIST_PKT_MSG_Q_RECV_REQ */
  169. {
  170. DIST_PKT recvReqHdr;
  171. uint32_t recvReqInqId;
  172. uint32_t recvReqMaxNBytes;
  173. uint32_t recvReqTimeout;
  174. TBL_IX recvReqTblIx; /* uint8_t */
  175. __DIST_PKT_HDR_END__
  176. } DIST_PKT_MSG_Q_RECV_REQ;
  177. typedef struct /* DIST_PKT_MSG_Q_RECV_RPL */
  178. {
  179. DIST_PKT recvRplHdr;
  180. uint32_t recvRplInqId;
  181. __DIST_PKT_HDR_END__
  182. /* message follows */
  183. } DIST_PKT_MSG_Q_RECV_RPL;
  184. typedef struct /* DIST_PKT_MSG_Q_NUM_MSGS_REQ */
  185. {
  186. DIST_PKT numMsgsReqHdr;
  187. uint32_t numMsgsReqInqId;
  188. TBL_IX numMsgsReqTblIx; /* uint8_t */
  189. __DIST_PKT_HDR_END__
  190. } DIST_PKT_MSG_Q_NUM_MSGS_REQ;
  191. typedef struct /* DIST_PKT_MSG_Q_NUM_MSGS_RPL */
  192. {
  193. DIST_PKT numMsgsRplHdr;
  194. uint32_t numMsgsRplInqId;
  195. uint32_t numMsgsRplNum;
  196. __DIST_PKT_HDR_END__
  197. } DIST_PKT_MSG_Q_NUM_MSGS_RPL;
  198. typedef struct /* DIST_PKT_MSG_Q_STATUS */
  199. {
  200. DIST_PKT statusHdr;
  201. uint32_t statusInqId;
  202. uint32_t statusErrno;
  203. uint16_t statusDStatus;
  204. __DIST_PKT_HDR_END__
  205. } DIST_PKT_MSG_Q_STATUS;
  206. /*
  207.  * Inquiry nodes.
  208.  */
  209. typedef struct /* DIST_MSG_Q_SEND_INQ */
  210. {
  211. DIST_INQ sendInq;
  212. SEMAPHORE sendInqWait;
  213. int sendInqTask;
  214. BOOL sendInqMsgQueued;
  215. BOOL        remoteError;
  216. } DIST_MSG_Q_SEND_INQ;
  217. typedef struct /* DIST_MSG_Q_RECV_INQ */
  218. {
  219. DIST_INQ recvInq;
  220. SEMAPHORE recvInqWait;
  221. int recvInqTask;
  222. char *pRecvInqBuffer;
  223. UINT recvInqMaxNBytes;
  224. BOOL recvInqMsgArrived;
  225. BOOL        remoteError;
  226. } DIST_MSG_Q_RECV_INQ;
  227. typedef struct /* DIST_MSG_Q_NUM_MSGS_INQ */
  228. {
  229. DIST_INQ numMsgsInq;
  230. SEMAPHORE numMsgsInqWait;
  231. int numMsgsInqTask;
  232. int numMsgsInqNum;
  233. } DIST_MSG_Q_NUM_MSGS_INQ;
  234. extern FUNCPTR msgQDistShowRtn;
  235. extern FUNCPTR msgQDistInfoGetRtn;
  236. /* function declarations */
  237. #if defined(__STDC__) || defined(__cplusplus)
  238. MSG_Q_ID msgQDistGetMapped (MSG_Q_ID msgQId);
  239. #else   /* __STDC__ */
  240. MSG_Q_ID msgQDistGetMapped ();
  241. #endif  /* __STDC__ */
  242. #ifdef __cplusplus
  243. }
  244. #endif
  245. #endif /* __INCmsgQDistLibPh */