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

VxWorks

开发平台:

C/C++

  1. /* ioQLib.c - I/O queue library for async I/O */
  2. /* Copyright 1984-1994 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01c,26jan94,kdl  changed name from ioQPxLib.c to ioQLib.c.
  8. 01b,05jan94,kdl  general cleanup.
  9. 01a,04apr93,elh  written.
  10. */
  11. /* 
  12. DESCRIPTION
  13. This library is used in conjuction with asynchronous I/O.  It defines
  14. the I/O queues used by AIO drivers, as well as the functions to 
  15. manipulate these queues.  To use this library, the driver mantains a 
  16. definition of an IO_Q in its driver specific structures.  The IO_Q
  17. structure defines the work queue, the wait queue and the lock routines 
  18. to synchronize access to these queues. Each I/O operation is defined by 
  19. the ioNode structure.   
  20. INTERNAL
  21. The I/O queues are currently written as linked lists.  This is probably 
  22. not reasonable for I/O drivers.  These routines should (are expected to) 
  23. change if/when true asynchronous drivers are written for VxWorks.
  24. NOMANUAL 
  25. */
  26. /* includes */
  27. #include "vxWorks.h"
  28. #include "ioQLib.h"
  29. /*******************************************************************************
  30. * ioQInit - initialize an I/O queue structure.
  31. * This routine initializes the I/O work and wait queue associated with <pQ>.
  32. * <pLock> and <pUnlock> are the routines which provide mutual exclusion 
  33. * of the queue.
  34. *
  35. * RETURNS: N/A
  36. */
  37. void ioQInit 
  38.     (
  39.     IO_Q * pQ, /* queue */
  40.     VOIDFUNCPTR pLock, /* lock routine */
  41.     VOIDFUNCPTR pUnlock, /* unlock routine */
  42.     int  lockArg /* lock/unlock arg */
  43.     )
  44.     {
  45.     /* Initialize linked lists */
  46.     lstInit (&pQ->workQ);
  47.     lstInit (&pQ->waitQ);
  48.     /* Set up queue function pointers */
  49.     pQ->lock    = pLock;
  50.     pQ->unlock  = pUnlock;
  51.     pQ->lockArg = lockArg;
  52.     }
  53. /*******************************************************************************
  54. * ioQAdd - add an I/O node to an I/O queue. 
  55. * This routine adds <pNode> to the queue <pQ>.   Requests are queued in priority
  56. * order according to <prio>.
  57. *
  58. * RETURNS: N/A
  59. */
  60. void ioQAdd
  61.     (
  62.     LIST * pQ, /* I/O queue */
  63.     IO_NODE * pNode,  /* I/O node */
  64.     int prio /* priority */
  65.     )
  66.     {
  67.     IO_NODE * pTemp;  /* temp var */
  68.     pNode->prio = prio;
  69.     for (pTemp = (IO_NODE *) lstFirst (pQ); (pTemp != NULL); 
  70.  pTemp = (IO_NODE *) lstNext (&pTemp->node))
  71. {
  72. if (prio < pTemp->prio)
  73.     {
  74.     lstInsert (pQ, pTemp->node.previous, &pNode->node);
  75.     return;
  76.     }
  77. }
  78.     lstAdd (pQ, &pNode->node);
  79.     }
  80. /*******************************************************************************
  81. * ioQNodeDone - node completed 
  82. *
  83. * ioQNodeDone gets called on completion of I/O node <pNode>.
  84. *
  85. * RETURNS: N/A
  86. */
  87. void ioQNodeDone
  88.     (
  89.     IO_NODE *    pNode /* I/O Node */
  90.     )
  91.     {
  92.     (* pNode->doneRtn) (pNode);
  93.     }
  94. /*******************************************************************************
  95. * ioQEach - call routine for node on queue. 
  96. *
  97. * This routine calls <pRoutine> with arguments <arg1> and <arg2>.  It does
  98. * this for each node on list <pQ> until <pRoutine> returns FALSE or until
  99. * the end of the list is reached.
  100. *
  101. * RETURNS: the pointer to the node which returned false or 
  102. *    NULL if all elements in the list were processed.
  103. */
  104. IO_NODE * ioQEach 
  105.     (
  106.     LIST *  pQ, /* I/O list */
  107.     FUNCPTR pRoutine, /* routine to call */
  108.     int arg1, /* argument 1 */
  109.     int arg2 /* argument 2 */
  110.     )
  111.     {
  112.     IO_NODE * pNode; /* I/O node */
  113.     IO_NODE * pNext; /* next I/O node */
  114.     for (pNode = (IO_NODE *) lstFirst (pQ); (pNode != NULL);)
  115.       {
  116. pNext = (IO_NODE *) lstNext (&pNode->node);
  117.    if (((* pRoutine) (pNode, arg1, arg2)) == FALSE)
  118.     break;
  119. pNode = pNext;
  120.         }
  121.     return (pNode);
  122.     }
  123. /*******************************************************************************
  124. * ioQLockSem - lock I/O queue with semaphores
  125. *
  126. * This routine provides mutual exclusion to the I/O queues with semaphores.
  127. * It is an example lock routine that can be passed to ioQInit.
  128. *
  129. * RETURNS: N/A
  130. */
  131. void ioQLockSem
  132.     (
  133.     SEM_ID semId /* semaphore */
  134.     )
  135.     {
  136.     semTake (semId, WAIT_FOREVER);
  137.     }
  138. /*******************************************************************************
  139. * ioQUnlockSem - unlock I/O queue with semaphores
  140. *
  141. * This routine provides mutual exclusion to the I/O queues with semaphores.
  142. * It is an example lock routine that can be passed to ioQInit.
  143. *
  144. * RETURNS: N/A
  145. */
  146. void ioQUnlockSem
  147.     (
  148.     SEM_ID semId /* semaphore */
  149.     )
  150.     {
  151.     semGive (semId);
  152.     }