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

VxWorks

开发平台:

C/C++

  1. /* qFifoLib.c - wind active queue library */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01i,19jul92,pme  made qFifoRemove return STATUS.
  8. 01h,26may92,rrr  the tree shuffle
  9. 01g,19nov91,rrr  shut up some ansi warnings.
  10. 01f,04oct91,rrr  passed through the ansification filter
  11.                   -changed functions to ansi style
  12.   -changed VOID to void
  13.   -changed copyright notice
  14. 01e,20sep90,jcf  documentation.
  15. 01d,10aug90,dnw  changed qFifoPut() to be void.
  16. 01c,05jul90,jcf  added null routine for calibrateRtn field in Q_CLASS.
  17. 01b,26jun90,jcf  fixed qFifoClass definition.
  18. 01a,14jun89,jcf  written.
  19. */
  20. /*
  21. DESCRIPTION
  22. This library contains routines to manage a first-in-first-out queue.  The
  23. routine qFifoPut takes a key in addition to a node to queue.  This key
  24. determines whether the node is placed at the head or tail of the queue.
  25. This queue complies with the multi-way queue data structures and thus may be
  26. utilized by any multi-way queue.  The FIFO multi-way queue class is accessed
  27. by the global id qFifoClassId.
  28. SEE ALSO: qLib.
  29. */
  30. #include "vxWorks.h"
  31. #include "qClass.h"
  32. #include "qFifoLib.h"
  33. #include "stdlib.h"
  34. /* forward static functions */
  35. static STATUS qFifoNullRtn (void);
  36. /* locals */
  37. LOCAL Q_CLASS qFifoClass =
  38.     {
  39.     (FUNCPTR)qFifoCreate,
  40.     (FUNCPTR)qFifoInit,
  41.     (FUNCPTR)qFifoDelete,
  42.     (FUNCPTR)qFifoNullRtn,
  43.     (FUNCPTR)qFifoPut,
  44.     (FUNCPTR)qFifoGet,
  45.     (FUNCPTR)qFifoRemove,
  46.     (FUNCPTR)qFifoNullRtn,
  47.     (FUNCPTR)qFifoNullRtn,
  48.     (FUNCPTR)qFifoNullRtn,
  49.     (FUNCPTR)qFifoNullRtn,
  50.     (FUNCPTR)qFifoNullRtn,
  51.     (FUNCPTR)qFifoInfo,
  52.     (FUNCPTR)qFifoEach,
  53.     &qFifoClass
  54.     };
  55. /* globals */
  56. Q_CLASS_ID qFifoClassId = &qFifoClass;
  57. /******************************************************************************
  58. *
  59. * qFifoCreate - allocate and initialize a FIFO queue
  60. *
  61. * This routine allocates and initializes a FIFO queue by allocating a
  62. * Q_FIFO_HEAD structure from the free memory pool.
  63. *
  64. * RETURNS: Pointer to a Q_FIFO_HEAD, or NULL if out of memory.
  65. */
  66. Q_FIFO_HEAD *qFifoCreate (void)
  67.     {
  68.     Q_FIFO_HEAD *pQFifoHead = (Q_FIFO_HEAD *) malloc (sizeof (Q_FIFO_HEAD));
  69.     if (pQFifoHead == NULL)
  70. return (NULL);
  71.     qFifoInit (pQFifoHead);
  72.     return (pQFifoHead);
  73.     }
  74. /******************************************************************************
  75. *
  76. * qFifoInit - initialize a FIFO queue
  77. *
  78. * This routine initializes the specified FIFO queue.
  79. *
  80. * RETURNS: OK, or ERROR if FIFO queue could not be initialized.
  81. */
  82. STATUS qFifoInit
  83.     (
  84.     Q_FIFO_HEAD *pQFifoHead
  85.     )
  86.     {
  87.     dllInit (pQFifoHead);
  88.     return (OK);
  89.     }
  90. /*******************************************************************************
  91. *
  92. * qFifoDelete - delete a FIFO queue
  93. *
  94. * This routine deallocates memory associated with the queue.  All queued
  95. * nodes are lost.
  96. *
  97. * RETURNS: OK, or ERROR if memory cannot be deallocated.
  98. */
  99. STATUS qFifoDelete
  100.     (
  101.     Q_FIFO_HEAD *pQFifoHead
  102.     )
  103.     {
  104.     free ((char *) pQFifoHead);
  105.     return OK;
  106.     }
  107. /*******************************************************************************
  108. *
  109. * qFifoPut - add a node to a FIFO queue
  110. *
  111. * This routine adds the specifed node to the FIFO queue.  The insertion is
  112. * either at the tail or head based on the specified key FIFO_KEY_TAIL or
  113. * FIFO_KEY_HEAD respectively.
  114. *
  115. * RETURNS: OK, or ERROR if node could not be added.
  116. */
  117. void qFifoPut
  118.     (
  119.     Q_FIFO_HEAD *pQFifoHead,
  120.     Q_FIFO_NODE *pQFifoNode,
  121.     ULONG        key
  122.     )
  123.     {
  124.     if (key == FIFO_KEY_HEAD)
  125. dllInsert (pQFifoHead, (DL_NODE *)NULL, pQFifoNode);
  126.     else
  127. dllAdd (pQFifoHead, pQFifoNode);
  128.     }
  129. /*******************************************************************************
  130. *
  131. * qFifoGet - get the first node out of a FIFO queue
  132. *
  133. * This routines dequeues and returns the first node of a FIFO queue.  If the
  134. * queue is empty, NULL will be returned.
  135. *
  136. * RETURNS: pointer the first node, or NULL if queue is empty.
  137. */
  138. Q_FIFO_NODE *qFifoGet
  139.     (
  140.     Q_FIFO_HEAD *pQFifoHead
  141.     )
  142.     {
  143.     if (DLL_EMPTY (pQFifoHead))
  144. return (NULL);
  145.     return ((Q_FIFO_NODE *) dllGet (pQFifoHead));
  146.     }
  147. /*******************************************************************************
  148. *
  149. * qFifoRemove - remove the specified node from a FIFO queue
  150. *
  151. * This routine removes the specified node from a FIFO queue.
  152. */
  153. STATUS qFifoRemove
  154.     (
  155.     Q_FIFO_HEAD *pQFifoHead,
  156.     Q_FIFO_NODE *pQFifoNode
  157.     )
  158.     {
  159.     dllRemove (pQFifoHead, pQFifoNode);
  160.     return (OK);
  161.     }
  162. /*******************************************************************************
  163. *
  164. * qFifoInfo - get information of a FIFO queue
  165. *
  166. * This routine returns information of a FIFO queue.  If the parameter nodeArray
  167. * is NULL, the number of queued nodes is returned.  Otherwise, the specified
  168. * nodeArray is filled with a node pointers of the FIFO queue starting from the
  169. * head.  Node pointers are copied until the TAIL of the queue is reached or
  170. * until maxNodes has been entered in the nodeArray.
  171. *
  172. * RETURNS: Number of nodes entered in nodeArray, or nodes in FIFO queue.
  173. *
  174. * ARGSUSED
  175. */
  176. int qFifoInfo
  177.     (
  178.     Q_FIFO_HEAD *pQFifoHead,    /* FIFO queue to gather list for */
  179.     FAST int nodeArray[],       /* array of node pointers to be filled in */
  180.     FAST int maxNodes           /* max node pointers nodeArray can accomodate */
  181.     )
  182.     {
  183.     FAST DL_NODE *pNode = DLL_FIRST (pQFifoHead);
  184.     FAST int *pElement  = nodeArray;
  185.     if (nodeArray == NULL) /* NULL node array means return count */
  186. return (dllCount (pQFifoHead));
  187.     while ((pNode != NULL) && (--maxNodes >= 0))
  188. {
  189. *(pElement++) = (int)pNode; /* fill in table */
  190. pNode = DLL_NEXT (pNode); /* next node */
  191. }
  192.     return (pElement - nodeArray); /* return count of active tasks */
  193.     }
  194. /*******************************************************************************
  195. *
  196. * qFifoEach - call a routine for each node in a queue
  197. *
  198. * This routine calls a user-supplied routine once for each node in the
  199. * queue.  The routine should be declared as follows:
  200. * .CS
  201. *  BOOL routine (pQNode, arg)
  202. *      Q_FIFO_NODE *pQNode; /@ pointer to a queue node          @/
  203. *      int    arg; /@ arbitrary user-supplied argument @/
  204. * .CE
  205. * The user-supplied routine should return TRUE if qFifoEach() is to continue
  206. * calling it for each entry, or FALSE if it is done and qFifoEach() can exit.
  207. *
  208. * RETURNS: NULL if traversed whole queue, or pointer to Q_FIFO_NODE that
  209. *          qFifoEach stopped on.
  210. */
  211. Q_FIFO_NODE *qFifoEach
  212.     (
  213.     Q_FIFO_HEAD *pQHead,        /* queue head of queue to call routine for */
  214.     FUNCPTR     routine,        /* the routine to call for each table entry */
  215.     int         routineArg      /* arbitrary user-supplied argument */
  216.     )
  217.     {
  218.     FAST DL_NODE *pQNode = DLL_FIRST (pQHead);
  219.     while ((pQNode != NULL) && ((* routine) (pQNode, routineArg)))
  220. pQNode = DLL_NEXT (pQNode);
  221.     return (pQNode); /* return node we ended with */
  222.     }
  223. /*******************************************************************************
  224. *
  225. * qFifoNullRtn - null routine for queue class structure
  226. *
  227. * This routine does nothing and returns OK.
  228. *
  229. * RETURNS: OK
  230. *
  231. * NOMANUAL
  232. */
  233. LOCAL STATUS qFifoNullRtn (void)
  234.     {
  235.     return (OK);
  236.     }