亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? selectlib.c

?? VxWorks操作系統內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
    if (pWriteFds != NULL)	for (fd = 0; fd < width; fd++)	    {	    /* look at the fd_set a long word at a time */	    partMask = pWriteFds->fds_bits[((unsigned)fd) / NFDBITS];	    if (partMask == 0)		fd += NFDBITS - 1;	    else if (partMask & (1 << (((unsigned) fd) % NFDBITS)))		{		numFound++;		}	    }    return (numFound);    }/******************************************************************************** selDoIoctls - perform the given ioctl on all the fd's in a mask** RETURNS: OK or ERROR if ioctl failed.*/LOCAL STATUS selDoIoctls    (    FAST fd_set *pFdSet,    FAST int fdSetWidth,    FAST int ioctlFunc,    FAST SEL_WAKEUP_NODE *pWakeupNode,    BOOL stopOnErr    )    {    FAST int fd;    FAST int partMask;    int status = OK;    for (fd = 0; fd < fdSetWidth; fd++)	{	/* look at the fd_set a long word at a time */	partMask = pFdSet->fds_bits[((unsigned)fd)/NFDBITS];	if (partMask == 0)	    fd += NFDBITS - 1;	else if (partMask & (1 << (((unsigned) fd) % NFDBITS)))	    {	    pWakeupNode->fd = fd;	    if (ioctl (fd, ioctlFunc, (int)pWakeupNode) != OK)		{		status = ERROR;		if (stopOnErr)		    break;		}	    }	}    return (status);    }/* The following routines are available to drivers to manage wake-up lists *//******************************************************************************** selWakeup - wake up a task pended in select()** This routine wakes up a task pended in select().  Once a driver's* FIOSELECT function installs a wake-up node in a device's wake-up list* (using selNodeAdd()) and checks to make sure the device is ready, this* routine ensures that the select() call does not pend.** RETURNS: N/A*/void selWakeup    (    SEL_WAKEUP_NODE *pWakeupNode        /* node to wake up */    )    {    SEL_CONTEXT *pSelectContext;    pSelectContext = ((WIND_TCB *)pWakeupNode->taskId)->pSelectContext;    switch (pWakeupNode->type)	{	case SELREAD:	    FD_SET(pWakeupNode->fd, pSelectContext->pReadFds);	    break;	case SELWRITE:	    FD_SET(pWakeupNode->fd, pSelectContext->pWriteFds);	    break;	}    semGive (&pSelectContext->wakeupSem);    }/******************************************************************************** selWakeupAll - wake up all tasks in a select() wake-up list** This routine wakes up all tasks pended in select() that are waiting for* a device; it is called by a driver when the device becomes ready.  The* <type> parameter specifies the task to be awakened, either reader tasks* (SELREAD) or writer tasks (SELWRITE).** RETURNS: N/A*/void selWakeupAll    (    SEL_WAKEUP_LIST *pWakeupList, /* list of tasks to wake up */    FAST SELECT_TYPE type         /* readers (SELREAD) or writers (SELWRITE) */    )    {    FAST SEL_WAKEUP_NODE *pWakeupNode;    if (lstCount (&pWakeupList->wakeupList) == 0)	return;    if (intContext ())	{	excJobAdd (selWakeupAll, (int)pWakeupList, (int)type, 0, 0, 0, 0);	return;	}    semTake (&pWakeupList->listMutex, WAIT_FOREVER);    for (pWakeupNode = (SEL_WAKEUP_NODE *) lstFirst (&pWakeupList->wakeupList);         pWakeupNode != NULL;         pWakeupNode = (SEL_WAKEUP_NODE *) lstNext ((NODE *) pWakeupNode))         {         if (pWakeupNode->type == type)            selWakeup (pWakeupNode);         }    semGive (&pWakeupList->listMutex);    }/******************************************************************************** selNodeAdd - add a wake-up node to a select() wake-up list** This routine adds a wake-up node to a device's wake-up list.  It is * typically called from a driver's FIOSELECT function.** RETURNS: OK, or ERROR if memory is insufficient.*/STATUS selNodeAdd    (    SEL_WAKEUP_LIST *pWakeupList,	/* list of tasks to wake up */    SEL_WAKEUP_NODE *pWakeupNode	/* node to add to list */    )    {    SEL_WAKEUP_NODE *pCopyOfNode;    BOOL dontFree;    semTake (&pWakeupList->listMutex, WAIT_FOREVER);    if (lstCount (&pWakeupList->wakeupList) == 0)	{	pCopyOfNode = &pWakeupList->firstNode;	dontFree = TRUE;	}    else	{	pCopyOfNode = (SEL_WAKEUP_NODE *) malloc (sizeof (SEL_WAKEUP_NODE));	dontFree = FALSE;	}    if (pCopyOfNode == NULL)	{	semGive (&pWakeupList->listMutex);	return (ERROR);	}    *pCopyOfNode = *pWakeupNode;    pCopyOfNode->dontFree = dontFree;    lstAdd (&pWakeupList->wakeupList, (NODE *) pCopyOfNode);    semGive (&pWakeupList->listMutex);    return (OK);    }/******************************************************************************** selNodeDelete - find and delete a node from a select() wake-up list** This routine deletes a specified wake-up node from a specified wake-up* list.  Typically, it is called by a driver's FIOUNSELECT function.** RETURNS: OK, or ERROR if the node is not found in the wake-up list.*/STATUS selNodeDelete    (    SEL_WAKEUP_LIST *pWakeupList,	/* list of tasks to wake up */    SEL_WAKEUP_NODE *pWakeupNode	/* node to delete from list */    )    {    FAST SEL_WAKEUP_NODE *pWorkNode;    semTake (&pWakeupList->listMutex, WAIT_FOREVER);	/* get exclusion */    for (pWorkNode = (SEL_WAKEUP_NODE *) lstFirst (&pWakeupList->wakeupList);         pWorkNode != NULL;         pWorkNode = (SEL_WAKEUP_NODE *) lstNext ((NODE *) pWorkNode))	{	if ((pWorkNode->taskId == pWakeupNode->taskId) &&	    (pWorkNode->type == pWakeupNode->type))	    {	    lstDelete (&pWakeupList->wakeupList, (NODE *) pWorkNode);	    if (!(pWorkNode->dontFree))		free ((char *) pWorkNode);		/* deallocate node */	    semGive (&pWakeupList->listMutex);		/* release exclusion */	    return (OK);	    }         }    semGive (&pWakeupList->listMutex);			/* release exclusion */    return (ERROR);    }/******************************************************************************** selWakeupListInit - initialize a select() wake-up list** This routine should be called in a device's create routine to* initialize the SEL_WAKEUP_LIST structure.** RETURNS: N/A**/void selWakeupListInit    (    SEL_WAKEUP_LIST *pWakeupList	/* wake-up list to initialize */    )    {    lstInit (&pWakeupList->wakeupList);    semMInit (&pWakeupList->listMutex, mutexOptionsSelectLib);    }/******************************************************************************** selWakeupListTerm - terminate a select() wake-up list** This routine should be called in a device's terminate routine to* terminate the SEL_WAKEUP_LIST structure.** RETURNS: N/A**/void selWakeupListTerm    (    SEL_WAKEUP_LIST *pWakeupList	/* wake-up list to terminate */    )    {    semTerminate (&pWakeupList->listMutex);    }/******************************************************************************** selWakeupListLen - get the number of nodes in a select() wake-up list** This routine returns the number of nodes in a specified SEL_WAKEUP_LIST.* It can be used by a driver to determine if any tasks are currently* pended in select() on this device, and whether these tasks need to be* activated with selWakeupAll().** RETURNS:* The number of nodes currently in a select() wake-up list, or ERROR.**/int selWakeupListLen    (    SEL_WAKEUP_LIST *pWakeupList	/* list of tasks to wake up */    )    {    return (lstCount (&pWakeupList->wakeupList));    }/******************************************************************************** selWakeupType - get the type of a select() wake-up node** This routine returns the type of a specified SEL_WAKEUP_NODE.* It is typically used in a device's FIOSELECT function to determine* if the device is being selected for read or write operations.** RETURNS: SELREAD (read operation) or SELWRITE (write operation).**/SELECT_TYPE selWakeupType    (    SEL_WAKEUP_NODE *pWakeupNode	/* node to get type of */    )    {    return (pWakeupNode->type);    }/******************************************************************************** selTaskCreateHook - select task create hook** This routine creates a select context for the task.  The select context * for the root task is not created by this routine.  Instead, it is created * by the selectInit() routine.** The memory for the context is allocated from the system heap.  The amount* of memory allocated for the context is enough to support fd_sets of size* maxFiles, instead of the compile time value of FD_SETSIZE.** This routine is installed as a create hook by selectInit.*/LOCAL STATUS selTaskCreateHook    (    WIND_TCB *pNewTcb    )    {    SEL_CONTEXT *pSelectContext;    int		 fdSetBytes;    /*     * Allocate sufficient memory from the heap to contain the select     * context.  This memory includes space for the various fd_sets to     * handle file descriptors up to maxFiles, i.e. select() will not be     * limited to FD_SETSIZE.     */     fdSetBytes = sizeof (fd_mask) * howmany (maxFiles, NFDBITS);     pSelectContext = (SEL_CONTEXT *) malloc (sizeof (SEL_CONTEXT) + 		       				   2 * fdSetBytes);     if (pSelectContext == NULL)	return (ERROR);     /* assign various convenience fd_set pointers */     pSelectContext->pOrigReadFds   = (fd_set *) ((int) pSelectContext +						 sizeof (SEL_CONTEXT));     pSelectContext->pOrigWriteFds  = (fd_set *)				      ((int) pSelectContext->pOrigReadFds +					     fdSetBytes);     pSelectContext->pendedOnSelect = FALSE;   /* task is not pending */     /* initialize the task's wakeup binary semaphore */     if (semBInit (&pSelectContext->wakeupSem, SEM_Q_PRIORITY, 		   SEM_EMPTY) != OK)	 {	 free ((char*) pSelectContext);	 return (ERROR);	 }    /* initialization succeeded so set task's select context pointer */    pNewTcb->pSelectContext = pSelectContext;    return (OK);    }/******************************************************************************** selTaskDeleteHook - select task delete hook** If a task is deleted while it is pended in select, this delete hook* tells all the relevent devices to delete the wake-up node associated* with this task.  This routine is installed as a delete hook by * selTaskDeleteHookAdd().  RPC adds a delete hook to close the client and* server handle sockets -- we insure that the select delete hook gets * called before the RPC delete hook (so that the socket device still exists)* by installing it AFTER RPC initialization (see usrConfig.c).*/LOCAL void selTaskDeleteHook    (    WIND_TCB *pTcb    )    {    SEL_CONTEXT *pSelectContext = pTcb->pSelectContext;    /*      * A wakeup node is created on the deleting task's stack since     * the work node on the stack of the task being deleting may     * be inaccessible to the current task.     */    SEL_WAKEUP_NODE wakeupNode;    if (pSelectContext != NULL)	{	/* task pended in select()? */	if (pSelectContext->pendedOnSelect == TRUE)	    {	    wakeupNode.taskId = (int) pTcb;	    /* unregister all the read fd's */	    wakeupNode.type   = SELREAD;	    selDoIoctls (pSelectContext->pOrigReadFds, pSelectContext->width,			 FIOUNSELECT, &wakeupNode, FALSE);	    /* unregister all the write fd's */	    wakeupNode.type = SELWRITE;	    selDoIoctls (pSelectContext->pOrigWriteFds, pSelectContext->width,			 FIOUNSELECT, &wakeupNode, FALSE);	    }	semTerminate (&pSelectContext->wakeupSem);	free ((char *) pSelectContext);	}    }		/********************************************************************************* selTyAdd - tyLib FIOSELECT ioctl** This is located here to keep tyLib from dragging in selectLib.*/LOCAL void selTyAdd     (    TY_DEV *pTyDev,    int arg     )    {    selNodeAdd (&pTyDev->selWakeupList, (SEL_WAKEUP_NODE *) arg);    if ((selWakeupType ((SEL_WAKEUP_NODE *) arg) == SELREAD) &&		 (rngNBytes (pTyDev->rdBuf) > 0))	{	selWakeup ((SEL_WAKEUP_NODE *) arg);	}    if ((selWakeupType ((SEL_WAKEUP_NODE *) arg) == SELWRITE) &&		 rngFreeBytes (pTyDev->wrtBuf) > 0)	{	selWakeup ((SEL_WAKEUP_NODE *) arg);	}    }/********************************************************************************* selTyDelete - tyLib FIOUNSELECT ioctl** This is located here to keep tyLib from dragging in selectLib.*/LOCAL void selTyDelete    (    TY_DEV *pTyDev,    int arg     )    {    selNodeDelete (&pTyDev->selWakeupList, (SEL_WAKEUP_NODE *)arg);    }/********************************************************************************* selPtyAdd - ptyLib FIOSELECT ioctl** This is located here to keep ptyLib from dragging in selectLib.*/LOCAL void selPtyAdd     (    PSEUDO_DEV *pPtyDev,    int arg     )    {    selNodeAdd (&pPtyDev->masterSelWakeupList, (SEL_WAKEUP_NODE *) arg);    if ((selWakeupType ((SEL_WAKEUP_NODE *) arg) == SELREAD) &&		  rngNBytes (pPtyDev->tyDev.wrtBuf) > 0)		/* reversed read criteria for master */	{	selWakeup ((SEL_WAKEUP_NODE *) arg);	}    if ((selWakeupType ((SEL_WAKEUP_NODE *) arg) == SELWRITE) &&		 rngFreeBytes (pPtyDev->tyDev.rdBuf) > 0 )		/* reversed write criteria for master */	{	selWakeup ((SEL_WAKEUP_NODE *) arg);	}    }/********************************************************************************* selPtyDelete - ptyLib FIOUNSELECT ioctl** This is located here to keep ptyLib from dragging in selectLib.*/LOCAL void selPtyDelete    (    PSEUDO_DEV *pPtyDev,    int arg     )    {    selNodeDelete (&pPtyDev->masterSelWakeupList, (SEL_WAKEUP_NODE *)arg);    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美电影免费观看高清完整版在| 国产日韩精品一区二区三区 | 强制捆绑调教一区二区| 久久精品国产澳门| 在线观看视频一区二区| 久久久欧美精品sm网站| 亚洲一区二区精品久久av| 国产一区二区三区最好精华液| 欧美精三区欧美精三区| 亚洲免费在线播放| 国产99久久精品| 欧美tk—视频vk| 午夜久久久久久久久| 色婷婷久久久久swag精品| 国产精品狼人久久影院观看方式| 久久国产精品99久久人人澡| 欧美顶级少妇做爰| 天堂久久一区二区三区| 色一情一伦一子一伦一区| 中文字幕在线不卡一区二区三区| 精品一区二区三区的国产在线播放| 欧美日韩一区高清| 亚洲乱码国产乱码精品精小说 | 青青草97国产精品免费观看无弹窗版| 北条麻妃国产九九精品视频| 久久久精品影视| 韩国成人在线视频| 亚洲精品一区二区三区99| 日韩极品在线观看| 欧美男男青年gay1069videost| 亚洲三级在线观看| 97精品国产97久久久久久久久久久久| 欧美高清在线视频| 成人av片在线观看| 最新热久久免费视频| 不卡av在线网| 综合在线观看色| 色婷婷综合久久| 亚洲精品免费播放| 欧美日韩精品一区二区三区蜜桃| 亚洲夂夂婷婷色拍ww47| 欧美体内she精高潮| 午夜精品一区二区三区免费视频| 欧美日韩国产123区| 毛片不卡一区二区| 久久久久久久一区| 91香蕉视频在线| 夜夜精品视频一区二区 | 成人黄动漫网站免费app| 一区二区三区中文字幕电影| 色噜噜偷拍精品综合在线| 亚洲精品国产高清久久伦理二区| 欧美日韩色一区| 精品一二三四区| 国产精品国产三级国产专播品爱网| caoporen国产精品视频| 一级中文字幕一区二区| 91精品国产一区二区三区| 国内精品国产成人国产三级粉色| av资源站一区| 亚洲国产日日夜夜| 欧美裸体一区二区三区| 国内精品第一页| 亚洲人xxxx| 日韩视频免费观看高清完整版在线观看 | av成人老司机| 亚洲成a人v欧美综合天堂| 日韩三区在线观看| 成人美女在线观看| 视频一区视频二区中文字幕| 久久久精品人体av艺术| 色综合久久99| 国产在线精品视频| 亚洲影院理伦片| 国产日产欧美一区二区三区| 91麻豆.com| 国模无码大尺度一区二区三区| 亚洲男人的天堂在线aⅴ视频| 欧美成人艳星乳罩| 91黄色在线观看| 国产美女精品一区二区三区| 香蕉成人伊视频在线观看| 国产精品婷婷午夜在线观看| 91精品欧美一区二区三区综合在| 岛国精品在线观看| 全国精品久久少妇| 亚洲女同ⅹxx女同tv| 久久久久久久久久久99999| 欧美日本视频在线| 91色综合久久久久婷婷| 国产精品18久久久| 麻豆高清免费国产一区| 午夜视黄欧洲亚洲| 国产精品久久久一区麻豆最新章节| 6080亚洲精品一区二区| 91小宝寻花一区二区三区| 国产成人在线观看免费网站| 久久www免费人成看片高清| 亚洲一区二区三区中文字幕在线| 国产女主播视频一区二区| 日韩欧美国产综合| 91精品国模一区二区三区| 日本精品视频一区二区| 粉嫩嫩av羞羞动漫久久久| 精品一二线国产| 久久不见久久见免费视频1| 日韩黄色免费电影| 午夜免费久久看| 亚洲一区二区高清| 亚洲一区二区精品久久av| 亚洲欧美欧美一区二区三区| 亚洲天堂成人在线观看| 综合激情成人伊人| 亚洲人成伊人成综合网小说| 亚洲欧美日韩综合aⅴ视频| 中文字幕一区免费在线观看| 欧美激情中文字幕| 中文字幕成人av| 国产精品家庭影院| 国产精品成人网| 亚洲日本成人在线观看| 亚洲三级在线播放| 亚洲综合清纯丝袜自拍| 丝瓜av网站精品一区二区| 香蕉久久一区二区不卡无毒影院| 午夜亚洲国产au精品一区二区| 五月婷婷综合激情| 久久精品国产精品青草| 国产精品一二三四| av成人免费在线观看| 在线欧美日韩国产| 91精品国产综合久久精品图片| 日韩欧美国产一区二区三区| 国产午夜精品一区二区三区嫩草| 国产精品免费久久久久| 一区二区三区四区不卡在线 | 捆绑变态av一区二区三区| 久久精品国产99久久6| 国产精品538一区二区在线| 国产**成人网毛片九色| 色综合色狠狠天天综合色| 欧美伦理电影网| 久久久久97国产精华液好用吗| 国产精品拍天天在线| 亚洲一区二区三区四区不卡| 精品在线播放免费| 99re这里只有精品首页| 欧美男同性恋视频网站| 国产日韩精品视频一区| 一区二区免费看| 久久99国内精品| 91视频观看免费| 欧美一级二级三级蜜桃| 国产精品美女久久福利网站| 午夜视黄欧洲亚洲| 国产99久久久国产精品潘金| 欧美日韩国产成人在线免费| 国产日韩欧美亚洲| 日韩精品欧美精品| 99国产精品一区| 欧美不卡在线视频| 一区二区三区丝袜| 国产一区二区三区电影在线观看| 色婷婷激情久久| 久久久久久麻豆| 亚洲123区在线观看| 成人午夜免费电影| 欧美一区二区性放荡片| 亚洲视频图片小说| 国产做a爰片久久毛片| 欧美手机在线视频| 中文字幕视频一区| 国产一区在线看| 91精品国产麻豆国产自产在线 | 久久国产精品色婷婷| 一本大道综合伊人精品热热| 久久久久久久久久美女| 午夜精品免费在线| 在线亚洲欧美专区二区| 亚洲欧洲国产专区| 国产高清成人在线| 欧美不卡视频一区| 日韩影院在线观看| 欧美在线看片a免费观看| 亚洲视频一区在线| www.成人在线| 国产校园另类小说区| 激情综合色丁香一区二区| 777午夜精品免费视频| 一区二区三区**美女毛片| 成人美女视频在线看| 久久久99精品免费观看| 极品少妇xxxx精品少妇| 日韩精品中文字幕一区二区三区 | 亚洲免费观看在线观看| 成人精品视频一区二区三区尤物| 国产亚洲精品福利| 国产精品一区二区在线观看不卡 | 一级精品视频在线观看宜春院| 91丨porny丨蝌蚪视频|