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

VxWorks

开发平台:

C/C++

  1. /* msgQDistGrpLibP.h - distributed msg Q group library private hdr (VxFusion) */
  2. /* Copyright 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01b,24may99,drm  added vxfusion prefix to VxFusion related includes
  7. 01a,11jun97,ur   written.
  8. */
  9. #ifndef __INCmsgQDistGrpLibPh
  10. #define __INCmsgQDistGrpLibPh
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. #include "vxWorks.h"
  15. #include "sllLib.h"
  16. #include "dllLib.h"
  17. #include "hashLib.h"
  18. #include "sysLib.h"
  19. #include "vxfusion/distLib.h"
  20. #include "vxfusion/private/msgQDistLibP.h"
  21. #include "vxfusion/private/distPktLibP.h"
  22. #include "vxfusion/private/distNetLibP.h"
  23. #include "vxfusion/private/distNodeLibP.h"
  24. #include "vxfusion/private/distNameLibP.h"
  25. extern SEMAPHORE distGrpDbSemaphore;
  26. extern DIST_MSG_Q_GRP_ID distGrpIdNext;
  27. /*
  28.  * defines
  29.  */
  30. #define DIST_DGDB_SERV_NAME "tServDgdb"
  31. #define DIST_DGDB_SERV_TASK_PRIO 50
  32. #define DIST_DGDB_SERV_TASK_STACK_SZ 5000
  33. #define DIST_MSG_Q_GRP_SERV_NAME "tServGrp"
  34. #define DIST_MSG_Q_GRP_SERV_TASK_PRIO 50
  35. #define DIST_MSG_Q_GRP_SERV_TASK_STACK_SZ 5000
  36. #define DIST_GAP_SERV_NAME "tServGap"
  37. #define DIST_GAP_SERV_TASK_PRIO 50
  38. #define DIST_GAP_SERV_TASK_STACK_SZ 5000
  39. #define DIST_DGDB_SERV_NET_PRIO 0
  40. #define DIST_MSG_Q_GRP_SERV_NET_PRIO 0
  41. #define DIST_GAP_SERV_NET_PRIO 0
  42. #define DIST_GAP_MGR_WAKEUP_DSEC 10 /* wakeup manager once a sec */
  43. #define DIST_GAP_MGR_PRIO 50
  44. #define DIST_GAP_MGR_STACK_SZ 5000
  45. #define DIST_MSG_Q_GRP_WAIT_TASK_PRIO 50
  46. #define DIST_MSG_Q_GRP_WAIT_TASK_STACK_SZ 5000
  47. /*
  48.  * The following timeouts are in units of DIST_GAP_MGR_WAKEUP_DSEC.
  49.  */
  50. #define DIST_GAP_TRY_TIMO 2 /* 2 times DIST_GAP_MGR_WAKEUP_DSEC */
  51. #define DIST_GAP_WAIT_TIMO 2 /* 2 times DIST_GAP_MGR_WAKEUP_DSEC */
  52. #define DIST_GAP_MAX_RETRIES 1 /* a single retry */
  53. #define DIST_MSG_Q_GRP_PRIO 
  54. (servTable[DIST_ID_MSG_Q_GRP_SERV].servNetPrio)
  55. #define DIST_DGDB_PRIO 
  56. (servTable[DIST_ID_DGDB_SERV].servNetPrio)
  57. #define DIST_GAP_PRIO 
  58. (servTable[DIST_ID_GAP_SERV].servNetPrio)
  59. /* subtypes of DIST_PKT_TYPE_DGDB */
  60. #define DIST_PKT_TYPE_DGDB_ADD 0
  61. /* subtypes of DIST_PKT_TYPE_MSG_Q_GRP */
  62. #define DIST_PKT_TYPE_MSG_Q_GRP_SEND 0
  63. #define DIST_PKT_TYPE_MSG_Q_GRP_STATUS 1
  64. /* subtypes of DIST_PKT_TYPE_GAP */
  65. #define DIST_PKT_TYPE_GAP_OK 0
  66. #define DIST_PKT_TYPE_GAP_REJECT 1
  67. #define DIST_PKT_TYPE_GAP_TRY 2
  68. #define DIST_PKT_TYPE_GAP_ASK_WAIT 3
  69. #define DIST_PKT_TYPE_GAP_SET 4
  70. /* status codes for distributed groups */
  71. #define MSG_Q_DIST_GRP_STATUS_OK OK
  72. #define MSG_Q_DIST_GRP_STATUS_ERROR 1
  73. #define MSG_Q_DIST_GRP_STATUS_NOT_ENOUGH_MEMORY 2
  74. #define MSG_Q_DIST_GRP_STATUS_ILLEGAL_OBJ_ID 3
  75. #define MSG_Q_DIST_GRP_STATUS_PROTOCOL_ERROR 4
  76. #define MSG_Q_DIST_GRP_STATUS_INTERNAL_ERROR 5
  77. #define MSG_Q_DIST_GRP_STATUS_UNAVAIL 6
  78. #define MSG_Q_DIST_GRP_STATUS_LOCAL_TIMEOUT 7
  79. /* status codes for DGDB */
  80. #define DIST_GDB_STATUS_OK OK
  81. #define DIST_GDB_STATUS_PROTOCOL_ERROR 1
  82. /* status codes for GAP */
  83. #define DIST_GAP_STATUS_OK OK
  84. #define DIST_GRP_STATE_LOCAL_TRY 0 /* local node tries to create group */
  85. #define DIST_GRP_STATE_REMOTE_TRY 1 /* remote node tries to create group */
  86. #define DIST_GRP_STATE_WAIT 2 /* wait for id from remote node */
  87. #define DIST_GRP_STATE_WAIT_TRY 3 /* retry after wait */
  88. #define DIST_GRP_STATE_GLOBAL 5 /* group is global */
  89. #define DIST_MSG_Q_GRP_INQ_TYPE_SEND ((0 << 8) | DIST_MSG_Q_GRP_INQ)
  90. #define DIST_GAP_MGR_WAKEUP_TICKS 
  91. (DIST_GAP_MGR_WAKEUP_DSEC * (sysClkRateGet () / 10))
  92. #define msgQDistGrpLclGetId(distGrpDbNode) 
  93. ((distGrpDbNode)->grpDbId)
  94. /* msgQDistGrpLclSetId() is a function */
  95. #define msgQDistGrpLclGetState(distGrpDbNode) 
  96. ((distGrpDbNode)->grpDbState)
  97. #define msgQDistGrpLclSetState(distGrpDbNode, distGrpState) 
  98. ((distGrpDbNode)->grpDbState = (distGrpState))
  99. #define msgQDistGrpLclSetCreator(distGrpDbNode, distNodeId) 
  100. ((distGrpDbNode)->grpDbNodeId = (distNodeId))
  101. #define msgQDistGrpDbLockInit()
  102. semBInit (&distGrpDbSemaphore, SEM_Q_PRIORITY, SEM_FULL)
  103. #define msgQDistGrpDbUnlock() 
  104. semGive (&distGrpDbSemaphore)
  105. #define msgQDistGrpDbLock() 
  106. semTake (&distGrpDbSemaphore, WAIT_FOREVER)
  107. #define distGapLockInit() 
  108. semBInit (&distGapSemaphore, SEM_Q_PRIORITY, SEM_FULL)
  109. #define distGapUnlock() 
  110. semGive (&distGapSemaphore)
  111. #define distGapLock() 
  112. semTake (&distGapSemaphore, WAIT_FOREVER)
  113. #define msgQGrpSendInqLockInit(pInqId) 
  114. semBInit (&((pInqId)->sendInqLock), SEM_Q_PRIORITY, SEM_FULL)
  115. #define msgQGrpSendInqUnlock(pInqId) 
  116. semGive (&((pInqId)->sendInqLock))
  117. #define msgQGrpSendInqLock(pInqId) 
  118. semTake (&((pInqId)->sendInqLock), WAIT_FOREVER)
  119. #define DIST_PKT_GAP_MAX_LEN (sizeof (DIST_PKT_GAP_OK))
  120. /*
  121.  * typedefs
  122.  */
  123. /*
  124.  * Forward structure declarations [sic].
  125.  */
  126. #ifdef __STDC__
  127. struct _DIST_GRP_DB_NODE;
  128. #endif
  129. typedef struct /* DIST_GAP_NODE */
  130. {
  131. DL_NODE gapLink;
  132. struct _DIST_GRP_DB_NODE *pGapGrp;
  133. SL_LIST gapOutstand;
  134. short gapTimeout;
  135. short gapRetries;
  136. SEMAPHORE gapWaitFor;
  137. } DIST_GAP_NODE;
  138. typedef struct /* DIST_GAP_RESPONSE */
  139. {
  140. SL_NODE gapResponseNext;
  141. DIST_NODE_DB_NODE *pGapResponseNode;
  142. } DIST_GAP_RESPONSE;
  143. /* MSG_Q_GRP packets */
  144. typedef struct /* DIST_PKT_MSG_Q_GRP_SEND */
  145. {
  146. DIST_PKT pktMsgQGrpSendHdr;
  147. uint32_t pktMsgQGrpSendInqId;
  148. uint32_t pktMsgQGrpSendTimeout;
  149. DIST_MSG_Q_GRP_ID pktMsgQGrpSendId; /* uint16_t */
  150. __DIST_PKT_HDR_END__
  151. /* message follows */
  152. } DIST_PKT_MSG_Q_GRP_SEND;
  153. typedef struct /* DIST_PKT_MSG_Q_GRP_STATUS */
  154. {
  155. DIST_PKT pktMsgQGrpStatusHdr;
  156. uint32_t pktMsgQGrpStatusInqId;
  157. uint32_t pktMsgQGrpStatusErrno;
  158. uint16_t pktMsgQGrpStatusDStatus;
  159. __DIST_PKT_HDR_END__
  160. } DIST_PKT_MSG_Q_GRP_STATUS;
  161. /* DGDB (distributed group database) telegrams */
  162. typedef struct /* DIST_PKT_DGDB_ADD */
  163. {
  164. DIST_PKT pktDgdbAddHdr;
  165. DIST_NODE_ID pktDgdbAddCreator; /* uint32_t */
  166. DIST_MSG_Q_GRP_ID pktDgdbAddId; /* uint16_t */
  167. __DIST_PKT_HDR_END__
  168. /* group name follows */
  169. } DIST_PKT_DGDB_ADD;
  170. /* GAP (group agreement protocol) telegrams */
  171. typedef struct /* DIST_PKT_GAP_OK */
  172. {
  173. DIST_PKT okHdr;
  174. DIST_MSG_Q_GRP_ID okId; /* uint16_t */
  175. char okName[DIST_NAME_MAX_LENGTH + 1];
  176. } DIST_PKT_GAP_OK;
  177. typedef struct /* DIST_PKT_GAP_REJECT */
  178. {
  179. DIST_PKT rejectHdr;
  180. DIST_MSG_Q_GRP_ID rejectId; /* uint16_t */
  181. char rejectName[DIST_NAME_MAX_LENGTH + 1];
  182. } DIST_PKT_GAP_REJECT;
  183. typedef struct /* DIST_PKT_GAP_TRY */
  184. {
  185. DIST_PKT tryHdr;
  186. DIST_MSG_Q_GRP_ID tryId; /* uint16_t */
  187. char tryName[DIST_NAME_MAX_LENGTH + 1];
  188. } DIST_PKT_GAP_TRY;
  189. typedef struct /* DIST_PKT_GAP_ASK_WAIT */
  190. {
  191. DIST_PKT askWaitHdr;
  192. DIST_MSG_Q_GRP_ID askWaitId; /* uint16_t */
  193. char askWaitName[DIST_NAME_MAX_LENGTH + 1];
  194. } DIST_PKT_GAP_ASK_WAIT;
  195. typedef struct /* DIST_PKT_GAP_SET */
  196. {
  197. DIST_PKT setHdr;
  198. DIST_MSG_Q_GRP_ID setId; /* uint16_t */
  199. char setName[DIST_NAME_MAX_LENGTH + 1];
  200. } DIST_PKT_GAP_SET;
  201. /* other typedefs */
  202. typedef int DIST_GRP_STATE; /* DIST_GRP_STATE */
  203. typedef struct _DIST_GRP_DB_NODE /* DIST_GRP_DB_NODE */
  204. {
  205. union
  206. {
  207. SL_NODE freeNode; /* used to link free nodes */
  208. struct
  209. {
  210. char distGrpName[DIST_NAME_MAX_LENGTH + 1];
  211. DIST_MSG_Q_GRP_ID distGrpId; /* distributed group id */
  212. MSG_Q_ID msgQId; /* message queue id */
  213. DIST_NODE_ID distNodeId; /* id of the creating node */
  214. SL_LIST msgQIdLst; /* list of members */
  215. DIST_GRP_STATE grpState; /* current state of group */
  216. DIST_GAP_NODE *pDistGapNode; /* ptr to GAP structure */
  217. } dbNode;
  218. } stateNode;
  219. int ixNode;
  220. } DIST_GRP_DB_NODE;
  221. #define grpDbFreeNode stateNode.freeNode
  222. #define grpDbName stateNode.dbNode.distGrpName
  223. #define grpDbId stateNode.dbNode.distGrpId
  224. #define grpDbNodeId stateNode.dbNode.distNodeId
  225. #define grpDbMsgQIdLst stateNode.dbNode.msgQIdLst
  226. #define grpDbState stateNode.dbNode.grpState
  227. #define pGrpDbGapNode stateNode.dbNode.pDistGapNode
  228. #define grpDbMsgQId stateNode.dbNode.msgQId
  229. typedef struct /* DIST_GRP_HASH_NODE */
  230. {
  231. HASH_NODE hashNode;
  232. DIST_GRP_DB_NODE *pDbNode;
  233. } DIST_GRP_HASH_NODE;
  234. typedef struct /* DIST_GRP_MSG_Q_NODE */
  235. {
  236. SL_NODE slNode;
  237. MSG_Q_ID msgQId;
  238. } DIST_GRP_MSG_Q_NODE;
  239. typedef struct /* DIST_GRP_BURST */
  240. {
  241. DIST_NODE_ID burstNodeId;
  242. STATUS burstStatus;
  243. } DIST_GRP_BURST;
  244. typedef struct /* DIST_MSG_Q_GRP_SEND_INQ */
  245. {
  246. DIST_INQ sendInq;
  247. SEMAPHORE sendInqLock; /* lock this group-send inquiry */
  248.     SEMAPHORE sendInqWait;
  249. int sendInqTask;
  250. int sendInqNumBlocked;
  251. int sendInqNumOutstanding;
  252. DIST_STATUS sendInqStatus;
  253. } DIST_MSG_Q_GRP_SEND_INQ;
  254. /* declarations */
  255. #if defined(__STDC__) || defined(__cplusplus)
  256. DIST_MSG_Q_GRP_ID msgQDistGrpAgree (DIST_GRP_DB_NODE *pDistGrpDbNode);
  257. STATUS msgQDistGrpAddMember (DIST_GRP_DB_NODE *pDistGrpDbNode,
  258. MSG_Q_ID msgQId);
  259. STATUS msgQDistGrpSend (DIST_MSG_Q_GRP_ID distMsgQGrpId,
  260. char *buffer, UINT nBytes, int msgQTimeout,
  261. int overallTimeout, int priority);
  262. STATUS msgQDistGrpBurst (DIST_NODE_ID nodeId);
  263. DIST_GRP_DB_NODE *msgQDistGrpLclCreate (char *distGrpName,
  264. DIST_MSG_Q_GRP_ID grpId, DIST_GRP_STATE grpState);
  265. void msgQDistGrpLclSetId (DIST_GRP_DB_NODE *pDistGrpDbNode,
  266. DIST_MSG_Q_GRP_ID grpId);
  267. STATUS msgQDistGrpLclAddMember (DIST_GRP_DB_NODE *pDbNode,
  268. MSG_Q_ID msgQId);
  269. DIST_GRP_DB_NODE *msgQDistGrpLclFindByName (char *distGrpName);
  270. DIST_GRP_DB_NODE *msgQDistGrpLclFindById (DIST_MSG_Q_GRP_ID uniqGrpId);
  271. void msgQDistGrpLclEach (FUNCPTR routine, int routineArg);
  272. STATUS distGapLibInit (void);
  273. DIST_MSG_Q_GRP_ID distGapStart (DIST_GRP_DB_NODE *pDistGrpDbNode);
  274. void distGapNodeInit (DIST_GAP_NODE *pDistGapNode,
  275. DIST_GRP_DB_NODE *pDistGrpDbNode, BOOL link);
  276. void distGapNodeDelete (DIST_GAP_NODE *pDistGapNode);
  277. #else   /* __STDC__ */
  278. DIST_MSG_Q_GRP_ID msgQDistGrpAgree ();
  279. STATUS msgQDistGrpAddMember ();
  280. STATUS msgQDistGrpSend ();
  281. STATUS msgQDistGrpBurst ();
  282. DIST_GRP_DB_NODE *msgQDistGrpLclCreate ();
  283. void msgQDistGrpLclSetId ();
  284. STATUS msgQDistGrpLclAddMember ();
  285. DIST_GRP_DB_NODE *msgQDistGrpLclFindByName ();
  286. DIST_GRP_DB_NODE *msgQDistGrpLclFindById ();
  287. void msgQDistGrpLclEach ();
  288. STATUS distGapLibInit ();
  289. DIST_MSG_Q_GRP_ID distGapStart ();
  290. void distGapNodeInit ();
  291. void distGapNodeDelete ();
  292. #endif  /* __STDC__ */
  293. #ifdef __cplusplus
  294. }
  295. #endif
  296. #endif /* __INCmsgQDistGrpLibPh */