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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? semmlib.c

?? vxworks的完整的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
#else    objCoreInit (&pSemaphore->objCore, semClassId);#endif    return (OK);    }#ifdef semMLib_PORTABLE/********************************************************************************* semMGive - give a semaphore** Gives the semaphore.  If a higher priority task has already taken* the semaphore (so that it is now pended waiting for it), that task* will now become ready to run, and preempt the task that does the semGive().* If the semaphore is already full (it has been given but not taken) this* call is essentially a no-op.** If deletion safe option is enabled, an implicit taskUnsafe() operation will* occur.** If priority inversion safe option is enabled, and this is the last priority* inversion safe semaphore to be released, the calling task will revert to* its normal priority.** WARNING* This routine may not be used from interrupt level.** ERRNO: S_semLib_INVALID_OPERATION** INTERNAL* The use of the variables kernWork and semMGiveKernWork looks pretty lame.  It* is, in fact, necessary to facilitate the optimized version of this routine.* An optimized version would utilize a register for kernWork and stick the* value in semMGiveKernWork as a parameter to semMGiveKern().  This form of* parameter passing saves costly stack manipulation.** NOMANUAL*/STATUS semMGive    (    FAST SEM_ID semId   /* semaphore ID to give */    )    {    FAST int level;    FAST int kernWork = 0;    if (INT_RESTRICT () != OK)			/* restrict isr use */	return (ERROR);    level = intLock ();				/* LOCK INTERRUPTS */    if (OBJ_VERIFY (semId, semClassId) != OK)	/* check validity */	{	intUnlock (level);	return (ERROR);	}    if (taskIdCurrent != semId->semOwner)	/* check for ownership */	{	intUnlock (level);	errnoSet (S_semLib_INVALID_OPERATION);	return (ERROR);	}    if (semId->recurse > 0)			/* check recurse count */	{	semId->recurse --;			/* decrement recurse count */	intUnlock (level);	return (OK);	}    if ((semId->options & SEM_INVERSION_SAFE) &&	(-- taskIdCurrent->priMutexCnt == 0))        {	if (taskIdCurrent->priority != taskIdCurrent->priNormal)	    kernWork |= SEM_M_PRI_RESORT;	}    if ((semId->semOwner = (WIND_TCB *) Q_FIRST (&semId->qHead)) != NULL)	kernWork |= SEM_M_Q_GET;    else if (semId->events.taskId != (int)NULL)	kernWork |= SEM_M_SEND_EVENTS;    if ((semId->options & SEM_DELETE_SAFE) && 	(-- taskIdCurrent->safeCnt == 0) &&	(Q_FIRST (&taskIdCurrent->safetyQHead) != NULL))	kernWork |= SEM_M_SAFE_Q_FLUSH;    if (kernWork == 0)	{	intUnlock (level);			/* UNLOCK INTERRUPTS */	return (OK);	}    kernelState = TRUE;				/* KERNEL ENTER */    intUnlock (level);				/* UNLOCK INTERRUPTS */    semMGiveKernWork = kernWork;		/* setup the work to do */    return (semMGiveKern (semId));		/* do the work */    }/********************************************************************************* semMTake - take a semaphore** Takes the semaphore.  If the semaphore is empty, i.e., it has not been given* since the last semTake() or semInit(), this task will become pended until* the semaphore becomes available by some other task doing a semGive()* of it.  If the semaphore is already available, this call will empty* the semaphore, so that no other task can take it until this task gives* it back, and this task will continue running.** If deletion safe option is enabled, an implicit taskSafe() operation will* occur.** If priority inversion safe option is enabled, and the calling task blocks,* and the priority of the calling task is greater than the semaphore owner,* the owner will inherit the caller's priority.** WARNING* This routine may not be used from interrupt level.** NOMANUAL*/STATUS semMTake    (    FAST SEM_ID semId,  /* semaphore ID to take */    int timeout         /* timeout in ticks */    )    {    int level;    int status;    if (INT_RESTRICT () != OK)	return (ERROR);again:    level = intLock ();				/* LOCK INTERRUPTS */    if (OBJ_VERIFY (semId, semClassId) != OK)	{	intUnlock (level);			/* UNLOCK INTERRUPTS */	return (ERROR);	}    if (semId->semOwner == NULL)	{	semId->semOwner = taskIdCurrent;	/* update semaphore state */	if (semId->options & SEM_INVERSION_SAFE)	    taskIdCurrent->priMutexCnt ++;	/* update inherit count */	if (semId->options & SEM_DELETE_SAFE)	    taskIdCurrent->safeCnt ++;		/* update safety count */	intUnlock (level);			/* UNLOCK INTERRUPTS */	return (OK);	}    if (semId->semOwner == taskIdCurrent)	/* check for recursion */	{	semId->recurse ++;			/* keep recursion count */	intUnlock (level);			/* UNLOCK INTERRUPTS */	return (OK);	}    kernelState = TRUE;				/* KERNEL ENTER */    intUnlock (level);				/* UNLOCK INTERRUPTS */	    if (semMPendQPut (semId, timeout) != OK)	{	windExit ();				/* windPendQPut failed */	return (ERROR);	}    if ((status = windExit ()) == RESTART)	/* KERNEL EXIT */	{	timeout = SIG_TIMEOUT_RECALC(timeout);	goto again;				/* we got signalled */	}    return (status);    }#endif	/* semMLib_PORTABLE *//********************************************************************************* semMGiveForce - give a mutual-exclusion semaphore without restrictions** This routine gives a mutual-exclusion semaphore, regardless of semaphore* ownership.  It is intended as a debugging aid only.** The routine is particularly useful when a task dies while holding some* mutual-exclusion semaphore, because the semaphore can be resurrected.  The* routine will give the semaphore to the next task in the pend queue or make* the semaphore full if no tasks are pending.  In effect, execution will* continue as if the task owning the semaphore had actually given the* semaphore.** CAVEATS* This routine should be used only as a debugging aid, when the condition of* the semaphore is known.** RETURNS: OK, or ERROR if the semaphore ID is invalid.** SEE ALSO: semGive()*/STATUS semMGiveForce    (    FAST SEM_ID semId   /* semaphore ID to give */    )    {    STATUS status = OK;    int oldErrno = errno;    if (INT_RESTRICT () != OK)			/* restrict isr use */	return (ERROR);    if (OBJ_VERIFY (semId, semClassId) != OK)	/* check validity */	return (ERROR);#ifdef WV_INSTRUMENTATION    /* windview - level 1 event logging */    EVT_OBJ_3 (OBJ, semId, semClassId,	       EVENT_SEMMGIVEFORCE, semId, semId->options, semId->state);#endif    /* if semaphore is not taken, nothing has to be done. */    if (semId->semOwner == NULL)	return OK;    /* first see if we are giving away one of calling task's semaphores */    if (semId->semOwner == taskIdCurrent)	/* give semaphore until avail */	{	while (semId->semOwner == taskIdCurrent)/* loop until recurse == 0 */	    semGive (semId);			/* give semaphore */	return (OK);				/* done */	}    /* give another task's semaphore away.  Djkstra be damned... */    kernelState = TRUE;				/* KERNEL ENTER */    semId->recurse = 0;				/* initialize recurse count */    if ((semId->semOwner = (WIND_TCB *) Q_FIRST (&semId->qHead)) != NULL)	{#ifdef WV_INSTRUMENTATION    	/* windview - level 2 event logging */	EVT_TASK_1 (EVENT_OBJ_SEMGIVE, semId);#endif	windPendQGet (&semId->qHead);		/* unblock receiver */	semId->semOwner->pPriMutex = NULL;	/* receiver no longer pended */	if (semId->options & SEM_DELETE_SAFE)	    semId->semOwner->safeCnt ++;	/* increment receiver safety */	if (semId->options & SEM_INVERSION_SAFE)	    semId->semOwner->priMutexCnt ++;	/* update inherit count */	}    else	{	if (semId->events.taskId != (int)NULL)	/* sem is free, send events */	    {	    if (eventRsrcSend (semId->events.taskId,			       semId->events.registered) != OK)		{		if ((semId->options & SEM_EVENTSEND_ERR_NOTIFY) != 0x0)		    {		    status = ERROR;		    }		semId->events.taskId = (int)NULL;		}	    else if ((semId->events.options & EVENTS_SEND_ONCE) != 0x0)		semId->events.taskId = (int)NULL;	    }	}    if (status == ERROR)	{	windExit ();			/* KERNEL EXIT */	errnoSet (S_eventLib_EVENTSEND_FAILED);	}    else	{	errnoSet (oldErrno);	return (windExit ());		/* KERNEL EXIT */	}    return (status);    }/********************************************************************************* semMGiveKern - put current task on mutex semaphore pend queue** This routine is called if something of consequence occured in giving the* mutual exclusion semaphore that involved more lengthy processing.  Things* of consequence are: task to be unblocked, priority to be uninherited, or* task safety queue of deleters to be flushed.** INTERNAL* The use of the variables kernWork and semMGiveKernWork looks pretty lame.* It is, in fact, necessary to facilitate the optimized version of this routine.* An optimized version would utilize a register for kernWork and stick the* value in semMGiveKernWork as a parameter to semMGiveKern().  This form of* parameter passing saves costly stack manipulation.** NOMANUAL*/STATUS semMGiveKern    (    FAST SEM_ID semId   /* semaphore ID to take */    )    {    STATUS evStatus;    STATUS retStatus = OK;    int oldErrno = errno;    if (semMGiveKernWork & SEM_M_Q_GET)	{#ifdef WV_INSTRUMENTATION    	/* windview - level 2 event logging */	EVT_TASK_1 (EVENT_OBJ_SEMGIVE, semId);#endif	windPendQGet (&semId->qHead);		/* unblock receiver */	semId->semOwner->pPriMutex = NULL;	/* receiver no longer pended */	if (semId->options & SEM_DELETE_SAFE)	    semId->semOwner->safeCnt ++;	/* increment receiver safety */	if (semId->options & SEM_INVERSION_SAFE)	semId->semOwner->priMutexCnt ++;	/* update inherit count */	}    if (semMGiveKernWork & SEM_M_PRI_RESORT)	{	windPrioritySet (taskIdCurrent, taskIdCurrent->priNormal);	}    if (semMGiveKernWork & SEM_M_SAFE_Q_FLUSH)	{#ifdef WV_INSTRUMENTATION    	/* windview - level 2 event logging */	EVT_TASK_1 (EVENT_OBJ_SEMGIVE, semId);#endif	windPendQFlush (&taskIdCurrent->safetyQHead);	}    if ((semMGiveKernWork & SEM_M_SEND_EVENTS) != 0x0)	/* send events */	{	evStatus = eventRsrcSend (semId->events.taskId,			          semId->events.registered);	if (evStatus != OK)	    {	    if ((semId->options & SEM_EVENTSEND_ERR_NOTIFY) != 0x0)		{		oldErrno = S_eventLib_EVENTSEND_FAILED;		retStatus = ERROR;		}	    semId->events.taskId = (int)NULL;	    }	else if ((semId->events.options & EVENTS_SEND_ONCE) != 0x0)	    semId->events.taskId = (int)NULL;	}    if (retStatus == ERROR)	{	windExit ();	errnoSet (oldErrno);	}    else	{	errnoSet (oldErrno);	retStatus = windExit ();			/* KERNEL EXIT */	}    return (retStatus);    }/********************************************************************************* semMPendQPut - put current task on mutex semaphore pend queue** This routine is called if the mutex semaphore is empty and the caller must* pend.  It is called inside the kernel with kernelState == TRUE!  It is* pulled out of semMTake so optimized versions need not bother with the* following code.** RETURNS: OK, or ERROR if windPendQPut failed.* NOMANUAL*/STATUS semMPendQPut    (    FAST SEM_ID semId,  /* semaphore ID to take */    int timeout         /* timeout in ticks */    )    {#ifdef WV_INSTRUMENTATION    /* windview - level 2 event logging */    EVT_TASK_1 (EVENT_OBJ_SEMTAKE, semId);#endif    if (windPendQPut (&semId->qHead, timeout) != OK)	return (ERROR);    /* if taskIdCurrent is of a higher priority than the task that owns     * this semaphore, reprioritize the owner.     */    if (semId->options & SEM_INVERSION_SAFE)	{	taskIdCurrent->pPriMutex = semId;	/* track mutex we pend on */        if (taskIdCurrent->priority < semId->semOwner->priority)	    {	    windPrioritySet (semId->semOwner, taskIdCurrent->priority);	    }	}    return (OK);    }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品每日更新| 亚洲在线视频免费观看| www.成人在线| 男女激情视频一区| 一区二区中文视频| 精品日韩在线观看| 欧美亚洲国产怡红院影院| 狠狠狠色丁香婷婷综合久久五月| 国产精品美日韩| 精品理论电影在线| 欧美军同video69gay| 成人福利视频网站| 国内精品免费**视频| 亚洲成人手机在线| 亚洲视频网在线直播| 国产三级欧美三级| 精品欧美一区二区三区精品久久| 色老汉一区二区三区| 福利视频网站一区二区三区| 日韩国产欧美在线视频| 亚洲精品美国一| 国产精品免费av| 国产日韩一级二级三级| 亚洲精品一区二区在线观看| 欧美另类z0zxhd电影| 在线观看精品一区| 99re这里只有精品6| 日韩一区二区电影在线| 欧美日韩一区二区三区不卡 | 婷婷中文字幕一区三区| 国产精品女人毛片| 中文字幕乱码久久午夜不卡| 精品国偷自产国产一区| 欧美一区午夜视频在线观看| 欧美日韩你懂得| 欧洲av一区二区嗯嗯嗯啊| 91丨九色丨尤物| 91视视频在线观看入口直接观看www| 国产成人精品午夜视频免费| 国产一区二区按摩在线观看| 激情偷乱视频一区二区三区| 久久激情五月婷婷| 国产一区在线看| 国产高清精品久久久久| 国产91富婆露脸刺激对白| 国产传媒一区在线| 风间由美性色一区二区三区| 国产精品一区免费视频| 成人免费毛片a| av亚洲精华国产精华精| 日本乱码高清不卡字幕| 欧美视频精品在线| 欧美日韩精品是欧美日韩精品| 欧美伦理电影网| 日韩精品一区二区三区老鸭窝| 日韩午夜激情电影| 久久久美女毛片| 国产欧美va欧美不卡在线| 国产精品女上位| 亚洲一区精品在线| 美女视频免费一区| 成人三级伦理片| 欧美在线不卡视频| 91精品国产综合久久久久久漫画| 欧美大胆一级视频| 国产清纯白嫩初高生在线观看91 | 久久99精品一区二区三区三区| 麻豆精品国产传媒mv男同| 国产一区不卡视频| 色综合久久久久综合体| 精品视频一区二区不卡| 精品欧美乱码久久久久久1区2区 | 午夜精品久久久久久不卡8050 | 91蝌蚪porny| 欧美精品在线一区二区三区| 精品欧美乱码久久久久久1区2区| 欧美激情一区二区三区全黄| 亚洲女人小视频在线观看| 日韩高清不卡一区| 国产成人亚洲精品狼色在线| 日本精品视频一区二区| 欧美mv日韩mv国产网站| 成人免费在线观看入口| 日韩av不卡在线观看| 国产suv精品一区二区6| 精品视频在线免费| 日本一区二区三区高清不卡| 亚洲精品水蜜桃| 韩国在线一区二区| 91官网在线免费观看| 久久夜色精品国产欧美乱极品| 亚洲同性同志一二三专区| 免费观看在线综合色| 99久久99久久精品国产片果冻| 91精品中文字幕一区二区三区| 国产蜜臀av在线一区二区三区| 亚洲福利国产精品| 国产69精品久久99不卡| 91精品久久久久久久久99蜜臂| 日本一区二区电影| 青青草视频一区| 在线观看国产91| 中日韩av电影| 蜜臀91精品一区二区三区| 日本韩国欧美三级| 中文字幕免费一区| 免费观看日韩av| 在线看一区二区| 中文字幕乱码一区二区免费| 麻豆精品一二三| 欧亚一区二区三区| 亚洲欧美一区二区不卡| 国产福利精品一区| 欧美大片日本大片免费观看| 亚洲成a人v欧美综合天堂| 成人免费观看av| 久久综合色之久久综合| 舔着乳尖日韩一区| 91高清视频免费看| 亚洲视频一区在线观看| 成人精品视频一区二区三区| 日韩一区二区三区观看| 亚洲国产精品天堂| 色综合久久88色综合天天6| 国产精品无码永久免费888| 国产精品一二三四五| 日韩精品一区二区三区三区免费| 丝袜亚洲另类欧美| 欧美日韩一二区| 亚洲永久免费视频| 欧美性大战xxxxx久久久| 亚洲视频一区在线| 一本大道久久a久久综合| 国产精品三级久久久久三级| 高清国产一区二区三区| 国产亚洲va综合人人澡精品| 国产在线播放一区三区四| 欧美不卡一区二区三区四区| 免费在线观看精品| 欧美不卡视频一区| 韩日av一区二区| 国产欧美日韩精品a在线观看| 精品综合免费视频观看| 日韩欧美成人激情| 韩国精品一区二区| 久久久蜜桃精品| 成人黄色片在线观看| 国产精品美女久久久久高潮| 99久久精品国产毛片| 亚洲丝袜精品丝袜在线| 欧洲亚洲精品在线| 亚洲成a人v欧美综合天堂| 欧美一区二区三区视频在线观看| 日本不卡一二三| 久久久亚洲午夜电影| 国产高清在线精品| 国产精品麻豆欧美日韩ww| 一本大道久久a久久精品综合| 亚洲高清免费视频| 日韩欧美国产1| 国产老女人精品毛片久久| 国产精品国产三级国产专播品爱网| av在线一区二区三区| 一区二区三区四区亚洲| 欧美精品乱人伦久久久久久| 日本aⅴ免费视频一区二区三区| 精品美女一区二区| 成人午夜免费视频| 亚洲超碰97人人做人人爱| 精品国产一区二区国模嫣然| 国产69精品久久久久777| 一区二区三区在线播| 日韩一区二区三区av| 成人免费毛片嘿嘿连载视频| 亚洲精品高清在线| 日韩一区二区免费视频| 成人一区在线观看| 婷婷开心激情综合| 国产欧美日韩三级| 538prom精品视频线放| 国产成人h网站| 亚洲精品免费一二三区| 精品日韩在线观看| 91九色02白丝porn| 国产精品主播直播| 亚洲第一久久影院| 久久久久久久久久久黄色| 欧美主播一区二区三区美女| 韩国欧美国产1区| 亚洲成人免费av| 中文字幕+乱码+中文字幕一区| 欧美日韩国产免费一区二区| 国产另类ts人妖一区二区| 午夜久久久久久电影| 国产精品网曝门| 337p日本欧洲亚洲大胆精品 | 91丨porny丨首页| 久久er99热精品一区二区| 夜夜操天天操亚洲| 国产午夜精品一区二区三区视频|