usbListLib.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* usbListLib.c - Linked list utility functions */
  2. /* Copyright 2000 Wind River Systems, Inc. */
  3. /*
  4. Modification history
  5. --------------------
  6. 01a,10jun99,rcb  First.
  7. */
  8. /*
  9. DESCRIPTION
  10. This file inmplements a set of general-purpose linked-list functions which are
  11. portable across OS's.  Linked lists are a collection of LINK structures.  Each
  12. LINK structure contains a forward a backward list pointer.  Each LINK structure
  13. also contains a <pStruct> field which points (typically) to the caller's 
  14. structure which contains the LINK structure.
  15. usbListLink() and usbListUnlink() are used to add and remove LINK structures
  16. in a linked list.  The LINK field may be placed anywhere in the client's 
  17. structure, and the client's structure may even contain more than one LINK field
  18. - allowing the structure to be linked into multiple lists simultaneously.
  19. usbListFirst() retrieves the first structure on a linked list and usbListNext() 
  20. retrieves subsequent structures.
  21. */
  22. /* defines */
  23. #define DEBUG_LIST
  24. /* includes */
  25. #include "usb/usbPlatform.h"
  26. #include "usb/ossLib.h"
  27. #include "usb/usbListLib.h" /* our API */
  28. #ifdef DEBUG_LIST
  29. #include "assert.h"
  30. #endif
  31. /* functions */
  32. /***************************************************************************
  33. *
  34. * usbListLink - Add an element to a linked list
  35. *
  36. * Using the LINK structure <pLink>, add <pStruct> to the list of which the 
  37. * list head is <pHead>.  <flag> must be LINK_HEAD or LINK_TAIL.
  38. *
  39. * RETURNS: N/A
  40. */
  41. VOID usbListLink 
  42.     (
  43.     pLIST_HEAD pHead, /* list head */
  44.     pVOID pStruct, /* ptr to base of structure to be linked */
  45.     pLINK pLink, /* ptr to LINK structure to be linked */
  46.     UINT16 flag  /* indicates LINK_HEAD or LINK_TAIL */
  47.     )
  48.     {
  49.     pLINK *ppTail;
  50.     #ifdef DEBUG_LIST
  51.     /* See if the indicated pStruct is already on the list. */
  52.     pVOID pElement = usbListFirst (pHead);
  53.     pUINT8 pElementLink;
  54.     while (pElement != NULL)
  55. {
  56. assert (pElement != pStruct);
  57. pElementLink = (pUINT8) pElement;
  58. pElementLink += ((pUINT8) pLink) - ((pUINT8) pStruct);
  59. pElement = usbListNext ((pLINK) pElementLink);
  60. }
  61.     #endif /* #ifdef DEBUG_LIST */
  62.     pLink->pStruct = pStruct;
  63.     if (flag == LINK_HEAD) 
  64. {
  65. /* Add the Entry to the head of the list. */
  66. pLink->linkFwd = pHead->pLink;
  67. pLink->linkBack = (pLINK) pHead;
  68. if (pHead->pLink != NULL)
  69.     pHead->pLink->linkBack = pLink;
  70. pHead->pLink = pLink;
  71. }
  72.     else 
  73. {
  74. /* Add the entry to the tail of the list. */
  75. for (ppTail = &pHead->pLink; *ppTail != NULL; 
  76.     ppTail = &((*ppTail)->linkFwd))
  77.     ;
  78. pLink->linkFwd = NULL;
  79. pLink->linkBack = (pLINK) ppTail;
  80. *ppTail = pLink;
  81. }
  82.     }
  83. /***************************************************************************
  84. *
  85. * usbListLinkProt - Add an element to a list guarded by a mutex
  86. *
  87. * This function is similar to linkList() with the addition that this
  88. * function will take the <mutex> prior to manipulating the list.
  89. *
  90. * NOTE: The function will block forever if the mutex does not become
  91. * available.
  92. *
  93. * RETURNS: N/A
  94. */
  95. VOID usbListLinkProt 
  96.     (
  97.     pLIST_HEAD pHead, /* list head */
  98.     pVOID pStruct, /* ptr to base of structure to be linked */
  99.     pLINK pLink, /* ptr to LINK structure to be linked */
  100.     UINT16 flag, /* indicates LINK_HEAD or LINK_TAIL */
  101.     MUTEX_HANDLE mutex /* list guard mutex */
  102.     )
  103.     {
  104.     OSS_MUTEX_TAKE (mutex, OSS_BLOCK);
  105.     usbListLink (pHead, pStruct, pLink, flag);
  106.     OSS_MUTEX_RELEASE (mutex);
  107.     }
  108.     
  109. /***************************************************************************
  110. *
  111. * usbListUnlink - Remove an entry from a linked list
  112. *
  113. * Removes <pLink> from a linked list.
  114. *
  115. * RETURNS: N/A
  116. */
  117. VOID usbListUnlink 
  118.     (
  119.     pLINK pLink  /* LINK structure to be unlinked */
  120.     )
  121.     {
  122.     /* De-link pElement from its linked-lis. */
  123.     if (pLink->linkBack) {
  124. pLink->linkBack->linkFwd = pLink->linkFwd;
  125.     }
  126.     if (pLink->linkFwd) {
  127. pLink->linkFwd->linkBack = pLink->linkBack;
  128.     }
  129.     pLink->linkBack = pLink->linkFwd = NULL;
  130.     }
  131. /***************************************************************************
  132. *
  133. * usbListUnlinkProt - Removes an element from a list guarged by a mutex
  134. *
  135. * This function is the same as usbListUnlink() with the addition that this
  136. * function will take the <mutex> prior to manipulating the list.
  137. *
  138. * NOTE: The function will block forever if the mutex does not become
  139. * available.
  140. *
  141. * RETURNS: N/A
  142. */
  143. VOID usbListUnlinkProt
  144.     (
  145.     pLINK pLink, /* LINK structure to be unlinked */
  146.     MUTEX_HANDLE mutex /* list guard mutex */
  147.     )
  148.     {
  149.     OSS_MUTEX_TAKE (mutex, OSS_BLOCK);
  150.     usbListUnlink (pLink);
  151.     OSS_MUTEX_RELEASE (mutex);
  152.     }
  153. /***************************************************************************
  154. *
  155. * usbListFirst - Returns first entry on a linked list
  156. *
  157. * Returns the pointer to the first structure in a linked list given a
  158. * pointer to the LIST_HEAD.
  159. *
  160. * RETURNS: <pStruct> of first structure on list or NULL if list empty.
  161. */
  162. pVOID usbListFirst
  163.     (
  164.     pLIST_HEAD pListHead /* head of linked list */
  165.     )
  166.     {
  167.     if (pListHead == NULL || pListHead->pLink == NULL)
  168. return NULL;
  169.     return pListHead->pLink->pStruct;
  170.     }
  171. /***************************************************************************
  172. *
  173. * usbListNext - Retrieves next pStruct in a linked list
  174. *
  175. * Returns the pointer to the next structure in a linked list given a 
  176. * <pLink> pointer.  The value returned is the <pStruct> of the element
  177. * in the linked list which follows the current <pLink>, not a pointer to
  178. * the following <pLink>.  (Typically, a client is more interested in
  179. * walking its own list of structures rather than the LINK structures
  180. * used to maintain the linked list.
  181. *
  182. * RETURNS: <pStruct> of next structure in list or NULL if end of list.
  183. */
  184. pVOID usbListNext
  185.     (
  186.     pLINK pLink  /* LINK structure */
  187.     )
  188.     {
  189.     if (pLink == NULL || pLink->linkFwd == NULL)
  190. return NULL;
  191.     return pLink->linkFwd->pStruct;
  192.     }
  193. /* End of file. */