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

VxWorks

开发平台:

C/C++

  1. /* distObjLib.c - distributed objects library (VxFusion option) */
  2. /* Copyright 1999 - 2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01c,23oct01,jws  fix complier warnings (SPR 71117)
  7. 01b,24may99,drm  added vxfusion prefix to VxFusion related includes
  8. 01a,13oct97,ur   written.
  9. */
  10. /*
  11. DESCRIPTION
  12. This library contains utility functions used internally by VxFusion.
  13. AVAILABILITY
  14. This module is distributed as a component of the unbundled distributed
  15. message queues option, VxFusion.
  16. */
  17. #include "vxWorks.h"
  18. #if defined (DIST_OBJ_REPORT) || defined (DIST_DIAGNOSTIC)
  19. #include "stdio.h"
  20. #endif
  21. #include "stdlib.h"
  22. #include "semLib.h"
  23. #include "private/semLibP.h"
  24. #include "hashLib.h"
  25. #include "vxfusion/private/distObjLibP.h"
  26. #define UNUSED_ARG(x)  if(sizeof(x)) {} /* to suppress compiler warnings */
  27. #define KEY            13
  28. #define KEY_CMP        0    /* unused */
  29. LOCAL DIST_INQ_ID    distInqIdNext = 0;
  30. LOCAL SEMAPHORE      distInqLock;
  31. LOCAL HASH_ID        distInqHashId;
  32. LOCAL BOOL           distInqInstalled = FALSE;
  33. LOCAL BOOL    distInqHCmpId (DIST_INQ *pMatchNode, DIST_INQ *pHNode,
  34.                              int unused);
  35. LOCAL BOOL    distInqHFuncId (int elements, DIST_INQ *pHNode, int divisor);
  36. /***************************************************************************
  37. *
  38. * distObjNodeGet - allocate space for a distributed object node (VxFusion option)
  39. *
  40. * This routine allocates space for a distributed object node.
  41. *
  42. * AVAILABILITY
  43. * This routine is distributed as a component of the unbundled distributed
  44. * message queues option, VxFusion.
  45. *
  46. * RETURNS: A pointer to a node, or NULL.
  47. *
  48. * NOMANUAL
  49. */
  50. DIST_OBJ_NODE * distObjNodeGet (void)
  51.     {
  52.     return ((DIST_OBJ_NODE *) malloc (sizeof (DIST_OBJ_NODE)));
  53.     }
  54. /***************************************************************************
  55. *
  56. * distObjNodeFree - free distributed object node space (VxFusion option)
  57. *
  58. * This routine frees distributed object node space.
  59. *
  60. * AVAILABILITY
  61. * This routine is distributed as a component of the unbundled distributed
  62. * message queues option, VxFusion.
  63. *
  64. * RETURNS: N/A
  65. * NOMANUAL
  66. */
  67. void distObjNodeFree
  68.     (
  69.     DIST_OBJ_NODE * pNode  /* node to free */
  70.     )
  71.     {
  72.     free (pNode);
  73.     }
  74. /***************************************************************************
  75. *
  76. * distInqInit - initialize Inq functionality (VxFusion option)
  77. *
  78. * This routine initializes Inq functionality.
  79. *
  80. * AVAILABILITY
  81. * This routine is distributed as a component of the unbundled distributed
  82. * message queues option, VxFusion.
  83. *
  84. * RETURNS: OK, if successful.
  85. *
  86. * NOMANUAL
  87. */
  88. STATUS distInqInit
  89.     (
  90.     int        hashTblSzLog2   /* allocate 2^^hashTblSzLog2 entries */
  91.     )
  92.     {
  93.     if (distInqInstalled)
  94.         return (OK);
  95.     
  96.     distInqHashId = hashTblCreate (hashTblSzLog2, distInqHCmpId,
  97.                                    distInqHFuncId, KEY);
  98.     if (distInqHashId == NULL)
  99.         return (ERROR);
  100.     distInqLockInit();
  101.     
  102.     distInqInstalled = TRUE;
  103.     return (OK);
  104.     }
  105. /***************************************************************************
  106. *
  107. * distInqRegister - register an Inq (VxFusion option)
  108. *
  109. * This routine registers an Inq.
  110. *
  111. * AVAILABILITY
  112. * This routine is distributed as a component of the unbundled distributed
  113. * message queues option, VxFusion.
  114. *
  115. * RETURNS: An Inq ID.
  116. * NOMANUAL
  117. */
  118. DIST_INQ_ID distInqRegister
  119.     (
  120.     DIST_INQ * pInqRegister  /* Inq to register */
  121.     )
  122.     {
  123.     DIST_INQ_ID    inqIdThis;
  124.     DIST_INQ       inqMatchNode;
  125.     distInqLock();
  126.     do
  127.         {
  128.         inqMatchNode.inqId = (inqIdThis = distInqIdNext++);
  129.         }
  130.     while (hashTblFind (distInqHashId, (HASH_NODE *) &inqMatchNode, KEY_CMP));
  131.     
  132.     pInqRegister->inqId = inqIdThis;
  133.     hashTblPut (distInqHashId, (HASH_NODE *) pInqRegister);
  134.     distInqUnlock();
  135.     return (inqIdThis);
  136.     }
  137. /***************************************************************************
  138. *
  139. * distInqGetId - Get the Inq ID of an Inq (VxFusion option)
  140. *
  141. * This routine gets the Inq ID of an Inq.
  142. *
  143. * AVAILABILITY
  144. * This routine is distributed as a component of the unbundled distributed
  145. * message queues option, VxFusion.
  146. *
  147. * RETURNS: An Inq ID.
  148. * NOMANUAL
  149. */
  150. DIST_INQ_ID distInqGetId
  151.     (
  152.     DIST_INQ * pInqGetIdOf   /* Inq whose ID to get */
  153.     )
  154.     {
  155.     return (pInqGetIdOf->inqId);
  156.     }
  157. /***************************************************************************
  158. *
  159. * distInqFind - given an Inq ID, get the Inq (VxFusion option)
  160. *
  161. * Given an Inq ID, this routine gets the Inq.
  162. *
  163. * AVAILABILITY
  164. * This routine is distributed as a component of the unbundled distributed
  165. * message queues option, VxFusion.
  166. *
  167. * RETURNS: An Inq.
  168. *
  169. * NOMANUAL
  170. */
  171. DIST_INQ * distInqFind
  172.     (
  173.     DIST_INQ_ID InqIdFind      /* Inq ID */
  174.     )
  175.     {
  176.     DIST_INQ     inqMatchNode;
  177.     DIST_INQ *   pInq;
  178.     inqMatchNode.inqId = InqIdFind;
  179.     distInqLock();
  180.     pInq = (DIST_INQ *) hashTblFind (distInqHashId,
  181.                                      (HASH_NODE *) &inqMatchNode,
  182.                                      KEY_CMP);
  183.     distInqUnlock();
  184.     return (pInq);
  185.     }
  186. /***************************************************************************
  187. *
  188. * distInqCancel - cancel (unregister) an Inq (VxFusion option)
  189. *
  190. * This routine cancels (unregisters) an Inq.
  191. *
  192. * AVAILABILITY
  193. * This routine is distributed as a component of the unbundled distributed
  194. * message queues option, VxFusion.
  195. *
  196. * RETURNS: N/A
  197. *
  198. * NOMANUAL
  199. */
  200. void distInqCancel
  201.     (
  202.     DIST_INQ * pInqCancel   /* Inq to cancel */
  203.     )
  204.     {
  205.     distInqLock();
  206.     hashTblRemove (distInqHashId, (HASH_NODE *) pInqCancel);
  207.     distInqUnlock();
  208.     }
  209. /***************************************************************************
  210. *
  211. * distInqHCmpId - hash compare function for Inq IDs (VxFusion option)
  212. *
  213. * This routine is the hash compare function for Inq IDs.
  214. *
  215. * AVAILABILITY
  216. * This routine is distributed as a component of the unbundled distributed
  217. * message queues option, VxFusion.
  218. *
  219. * RETURNS: TRUE, if the IDs match.
  220. *
  221. * NOMANUAL
  222. */
  223. LOCAL BOOL distInqHCmpId
  224.     (
  225.     DIST_INQ * pMatchNode,   /* the first Inq */
  226.     DIST_INQ * pHNode,       /* the second Inq */
  227.     int        unused
  228.     )
  229.     {
  230.     
  231.     UNUSED_ARG(unused);
  232.         
  233.     if (pMatchNode->inqId == pHNode->inqId)
  234.         {
  235.         return (TRUE);
  236.         }
  237.     return (FALSE);
  238.     }
  239. /***************************************************************************
  240. *
  241. * distInqHFuncId - hash function for Inq IDs (VxFusion option)
  242. *
  243. * This routine is the hash function for Inq IDs.
  244. *
  245. * AVAILABILITY
  246. * This routine is distributed as a component of the unbundled distributed
  247. * message queues option, VxFusion.
  248. *
  249. * RETURNS: A hash index.
  250. *
  251. * NOMANUAL
  252. */
  253. LOCAL int distInqHFuncId
  254.     (
  255.     int        elements,  /* size of hash table */
  256.     DIST_INQ * pHNode,    /* Inq to hash */
  257.     int        divisor    /* used by hash computation */
  258.     )
  259.     {
  260.     return ((pHNode->inqId % divisor) & (elements - 1));
  261.     }