⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usblistlib.c

📁 VxWorks下USB驱动的源代码!
💻 C
字号:
/* usbListLib.c - Linked list utility functions *//* Copyright 2000 Wind River Systems, Inc. *//*Modification history--------------------01a,10jun99,rcb  First.*//*DESCRIPTIONThis file inmplements a set of general-purpose linked-list functions which areportable across OS's.  Linked lists are a collection of LINK structures.  EachLINK structure contains a forward a backward list pointer.  Each LINK structurealso contains a <pStruct> field which points (typically) to the caller's structure which contains the LINK structure.usbListLink() and usbListUnlink() are used to add and remove LINK structuresin a linked list.  The LINK field may be placed anywhere in the client's structure, and the client's structure may even contain more than one LINK field- allowing the structure to be linked into multiple lists simultaneously.usbListFirst() retrieves the first structure on a linked list and usbListNext() retrieves subsequent structures.*//* defines */#define DEBUG_LIST/* includes */#include "usb/usbPlatform.h"#include "usb/ossLib.h"#include "usb/usbListLib.h"     /* our API */#ifdef DEBUG_LIST#include "assert.h"#endif/* functions *//***************************************************************************** usbListLink - Add an element to a linked list** Using the LINK structure <pLink>, add <pStruct> to the list of which the * list head is <pHead>.  <flag> must be LINK_HEAD or LINK_TAIL.** RETURNS: N/A*/VOID usbListLink (pLIST_HEAD pHead, /* list head */                  pVOID pStruct,    /* ptr to base of structure to be linked */                  pLINK pLink,  /* ptr to LINK structure to be linked */                  UINT16 flag   /* indicates LINK_HEAD or LINK_TAIL */    ){    pLINK *ppTail;#ifdef DEBUG_LIST    /* See if the indicated pStruct is already on the list. */    pVOID pElement = usbListFirst (pHead);    pUINT8 pElementLink;    while (pElement != NULL) {        assert (pElement != pStruct);        pElementLink = (pUINT8) pElement;        pElementLink += ((pUINT8) pLink) - ((pUINT8) pStruct);        pElement = usbListNext ((pLINK) pElementLink);    }#endif /* #ifdef DEBUG_LIST */    pLink->pStruct = pStruct;    if (flag == LINK_HEAD) {        /* Add the Entry to the head of the list. */        pLink->linkFwd = pHead->pLink;        pLink->linkBack = (pLINK) pHead;        if (pHead->pLink != NULL)            pHead->pLink->linkBack = pLink;        pHead->pLink = pLink;    } else {        /* Add the entry to the tail of the list. */        for (ppTail = &pHead->pLink; *ppTail != NULL; ppTail = &((*ppTail)->linkFwd));        pLink->linkFwd = NULL;        pLink->linkBack = (pLINK) ppTail;        *ppTail = pLink;    }}/***************************************************************************** usbListLinkProt - Add an element to a list guarded by a mutex** This function is similar to linkList() with the addition that this* function will take the <mutex> prior to manipulating the list.** NOTE: The function will block forever if the mutex does not become* available.** RETURNS: N/A*/VOID usbListLinkProt (pLIST_HEAD pHead, /* list head */                      pVOID pStruct,    /* ptr to base of structure to be linked */                      pLINK pLink,  /* ptr to LINK structure to be linked */                      UINT16 flag,  /* indicates LINK_HEAD or LINK_TAIL */                      MUTEX_HANDLE mutex    /* list guard mutex */    ){    OSS_MUTEX_TAKE (mutex, OSS_BLOCK);    usbListLink (pHead, pStruct, pLink, flag);    OSS_MUTEX_RELEASE (mutex);}/***************************************************************************** usbListUnlink - Remove an entry from a linked list** Removes <pLink> from a linked list.** RETURNS: N/A*/VOID usbListUnlink (pLINK pLink /* LINK structure to be unlinked */    ){    /* De-link pElement from its linked-lis. */    if (pLink->linkBack) {        pLink->linkBack->linkFwd = pLink->linkFwd;    }    if (pLink->linkFwd) {        pLink->linkFwd->linkBack = pLink->linkBack;    }    pLink->linkBack = pLink->linkFwd = NULL;}/***************************************************************************** usbListUnlinkProt - Removes an element from a list guarged by a mutex** This function is the same as usbListUnlink() with the addition that this* function will take the <mutex> prior to manipulating the list.** NOTE: The function will block forever if the mutex does not become* available.** RETURNS: N/A*/VOID usbListUnlinkProt (pLINK pLink,    /* LINK structure to be unlinked */                        MUTEX_HANDLE mutex  /* list guard mutex */    ){    OSS_MUTEX_TAKE (mutex, OSS_BLOCK);    usbListUnlink (pLink);    OSS_MUTEX_RELEASE (mutex);}/***************************************************************************** usbListFirst - Returns first entry on a linked list** Returns the pointer to the first structure in a linked list given a* pointer to the LIST_HEAD.** RETURNS: <pStruct> of first structure on list or NULL if list empty.*/pVOID usbListFirst (pLIST_HEAD pListHead    /* head of linked list */    ){    if (pListHead == NULL || pListHead->pLink == NULL)        return NULL;    return pListHead->pLink->pStruct;}/***************************************************************************** usbListNext - Retrieves next pStruct in a linked list** Returns the pointer to the next structure in a linked list given a * <pLink> pointer.  The value returned is the <pStruct> of the element* in the linked list which follows the current <pLink>, not a pointer to* the following <pLink>.  (Typically, a client is more interested in* walking its own list of structures rather than the LINK structures* used to maintain the linked list.** RETURNS: <pStruct> of next structure in list or NULL if end of list.*/pVOID usbListNext (pLINK pLink  /* LINK structure */    ){    if (pLink == NULL || pLink->linkFwd == NULL)        return NULL;    return pLink->linkFwd->pStruct;}/* End of file. */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -