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

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

?? smpktlib.c

?? vxworks的完整的源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
* <pPkt> was either sent or freed before this routine returned, and no* further action is required.)** RETURNS: OK, or ERROR.** ERRNO: S_smPktLib_NOT_ATTACHED, S_smPktLib_INVALID_PACKET,* S_smPktLib_PACKET_TOO_BIG, S_smPktLib_INVALID_CPU_NUMBER,* S_smPktLib_DEST_NOT_ATTACHED, S_smPktLib_INCOMPLETE_BROADCAST* */STATUS smPktSend    (    SM_PKT_DESC *	pSmPktDesc,	/* ptr to shared memory descriptor */    SM_PKT *		pPkt,		/* local addr of packet to be sent */    int			destCpu		/* destination cpu number */    )    {    SM_PKT volatile *		pPktv = (SM_PKT volatile *) pPkt;    STATUS			status;		/* return status */    SM_PKT_CPU_DESC volatile *	pPktCpuDesc;	/* destination cpu pkt descr*/    SM_CPU_DESC volatile *	pCpuDesc;	/* destination cpu descr*/    int				i;    BOOL			listWasEmpty;	/* list empty */    SM_DESC *			pSmDesc = (SM_DESC *) &pSmPktDesc->smDesc;    int                         tmp;            /* temp storage */    /* Check that this cpu is connected to shared memory */    if (pSmPktDesc->status != SM_CPU_ATTACHED)	{	errno = S_smPktLib_NOT_ATTACHED;	return (ERROR);				/* local cpu is not attached */	}    /* Check for null pointer */    if (pPkt == NULL)	{	errno = S_smPktLib_INVALID_PACKET;	return (ERROR);				/* null packet address */	}    /* Enforce max data length */    CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */    tmp = pPktv->header.nBytes;                 /* BRIDGE FLUSH  [SPR 68334] */    if (pPktv->header.nBytes > pSmPktDesc->maxPktBytes)	{	errno = S_smPktLib_PACKET_TOO_BIG;	return (ERROR);				/* too much data ! */	}						/* byte swap info */    pPktv->header.nBytes = htonl (pPktv->header.nBytes);    /* Call special routine if doing broadcast */    if (destCpu == SM_BROADCAST)		/* if sending to all cpu's */	return (smPktBroadcast (pSmPktDesc, pPkt));    /* Make sure destination cpu is valid and attached */    if (destCpu < 0  ||  destCpu >= pSmDesc->maxCpus)        {        errno = S_smPktLib_INVALID_CPU_NUMBER;        return (ERROR);				/* cpu number out of range */        }    pPktCpuDesc = &((pSmPktDesc->cpuLocalAdrs) [destCpu]);    pCpuDesc    = &((pSmDesc->cpuTblLocalAdrs) [destCpu]);    						/* get addr of cpu descriptor */    if (ntohl (pPktCpuDesc->status) != SM_CPU_ATTACHED)        {        errno = S_smPktLib_DEST_NOT_ATTACHED;        return (ERROR);				/* dest cpu is not attached */        }    /* Complete packet header info */    pPktv->header.srcCpu   = htonl (pSmDesc->cpuNum);	/* source cpu */    CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */    i = pPktv->header.srcCpu;			/* BRIDGE FLUSH  [SPR 68334] */    /* Add this packet to destination cpu's input list */    status = smPktSllPut (&(pPktCpuDesc->inputList), pSmDesc->base,			  pSmDesc->tasRoutine, pSmDesc->tasClearRoutine, 			  &(pPktv->header.node), &listWasEmpty);    if ((status == OK) && (listWasEmpty) && (destCpu != pSmDesc->cpuNum))        {	/* Interrupt destination cpu */	if ((status = smUtilIntGen ((SM_CPU_DESC *)pCpuDesc, destCpu)) != OK)            {            /*             * Packet put in input list but interrupt failed.             * This is not an error.  It means another interrupt will have             * to be sent after a short delay.  This will be repeated until             * the interrupt is successful or a timeout occurs.             * (See SPR 25341, 33771)             */            for (i = smPktMaxIntRetries; (status != OK) && (i > 0); --i)                {                taskDelay (1);                status = smUtilIntGen ((SM_CPU_DESC *)pCpuDesc, destCpu);                }            /* time out on interrupt generation */            if (status != OK)                {                /* packet still in input list so do NOT delete it */                errno = S_smPktLib_INCOMPLETE_BROADCAST;                }            }        }    return (status);    }/******************************************************************************** smPktBroadcast - send packet data to all attached CPU's via shared memory** This sends a copy of the packet specified by <pPkt> to all CPU's attached* to the specified shared memory area (except the sending CPU).** This routine attempts to obtain a new packet for each destination CPU,* copying the packet contents to each newly-acquired packet.  If no new* packets are available, this routine will go ahead and send the original* packet to the next destination CPU.  If there are still more destinations* after the original has been sent, an error (S_smPktLib_INCOMPLETE_BROADCAST)* is returned.  This same error is returned if one or more destinations did* not receive the broadcast due to other problems (e.g. the input queue for* a destination CPU was full).** RETURNS: OK, or ERROR.** ERRNO: S_smPktLib_INCOMPLETE_BROADCAST*/LOCAL STATUS smPktBroadcast    (    SM_PKT_DESC *	pSmPktDesc,	/* sh mem pkt descriptor */    SM_PKT volatile *	pPktOrig	/* ptr to original packet */    )    {    STATUS			status;		/* return status */    SM_PKT volatile *		pPkt;		/* ptr to packet being sent */    SM_PKT volatile *		pPktNew;	/* ptr to newly obtained pkt */    int				destCpu;	/* destination cpu number */    SM_CPU_DESC volatile *	pCpuDesc;	/* destination cpu descriptor*/    SM_PKT_CPU_DESC volatile *	pPktCpuDesc;	/* destination cpu descriptor*/    BOOL			destMissed;	/* TRUE if a dest was missed */    BOOL			listWasEmpty;	/* list added to was empty */    SM_DESC *			pSmDesc = (SM_DESC *) &pSmPktDesc->smDesc;    pCpuDesc = pSmDesc->cpuTblLocalAdrs;    pPktCpuDesc = pSmPktDesc->cpuLocalAdrs;    destMissed = FALSE;				/* no destinations missed yet */    /* Send copy of packet to each attached cpu (except self) */    for (destCpu = 0;  destCpu < pSmDesc->maxCpus;  destCpu++)        {        if ((ntohl (pPktCpuDesc->status) == SM_CPU_ATTACHED)  &&	    (destCpu != pSmDesc->cpuNum))    	    {    	    if (pPktOrig == NULL)		/* if original already used */    	    	{    	    	destMissed = TRUE;		/* weren't enough free packets*/    	    	break;				/* can't do any more */    	    	}	    /* Get new packet */    	    if (smPktFreeGet (pSmPktDesc, (SM_PKT **)&pPktNew) != OK)    	    	return (ERROR);			/* error getting packet */    	    if (pPktNew != NULL)		/* if a new pkt was obtained */    	    	{		pPkt = pPktNew;			/* it is the packet to send */    	    	pPkt->header.type   = pPktOrig->header.type;						/* copy packet type */    	    	pPkt->header.nBytes = pPktOrig->header.nBytes;						/* copy byte count */    	    	bcopy ((char *)pPktOrig->data, (char *)pPkt->data,    	    	       ntohl (pPkt->header.nBytes));    						/* copy packet data */    	    	}    	    else				/* if could not get new pkt */    	    	{    	    	pPkt = pPktOrig;		/*  set up to send original */    	    	}    	    pPkt->header.srcCpu  = htonl (pSmDesc->cpuNum);						/* source cpu number */    	    /* Send packet */            status = smPktSllPut (&(pPktCpuDesc->inputList), pSmDesc->base, 				  pSmDesc->tasRoutine, pSmDesc->tasClearRoutine,    			          &(pPkt->header.node), &listWasEmpty);            if ((status == OK) && listWasEmpty)	/* if list previously empty */        	{		/* Interrupt destination CPU */        	if (smUtilIntGen ((SM_CPU_DESC *)pCpuDesc, destCpu) != OK)		    {		    destMissed = TRUE;	/* a destination was missed */		    }        	}    	    else if (status == ERROR)		/* if error sending pkt */		{		/*		 *  NOTE: We do not return just because an error occurred.		 *        The destination cpu's input list may simply have been		 *        full, or some other error may have occurred which		 *	  will not affect the remaining destinations.  When		 *	  this routine ultimately returns, the broadcast will		 *	  be reported as having been incomplete.		 */		destMissed = TRUE;		/* a destination was missed */		if (pPkt != pPktOrig)		/* if pkt was not the original*/        	    {    	    	    /* New packet not sent - return to free pool */        	    if (smPktFreePut (pSmPktDesc, (SM_PKT *)pPkt) != OK)    		    	return (ERROR);		/* could not return packet */		    }    	    	}    	    if (pPkt == pPktOrig  &&  status != ERROR)    	    	{				/* if original actually sent */    	    	pPktOrig = NULL;		/*  clear pointer to orig pkt */    	    	}    	    }  /* end if (attached) */        pCpuDesc++;				/* next cpu descriptor */	pPktCpuDesc++;        }  /* end for */    /* Free original packet if it wasn't sent during broadcast */    if (pPktOrig != NULL)        {        if (smPktFreePut (pSmPktDesc, (SM_PKT *)pPktOrig) != OK)    	    return (ERROR);			/* could not free packet */        }    if (destMissed)				/* if a destination was missed*/	{    	errno = S_smPktLib_INCOMPLETE_BROADCAST;    	return (ERROR);				/* broadcast not complete */    	}    else	{    	return (OK);	}    }/******************************************************************************** smPktFreePut - return a shared memory packet to free list** This routine frees a shared memory packet.  The packet is placed* on the global free packet list.  No modification of the packet* contents is performed.** The address of the packet to be returned is specified in <pPkt>.** RETURNS: OK, or ERROR.** ERRNO: S_smPktLib_NOT_ATTACHED, S_smPktLib_INVALID_PACKET*/STATUS smPktFreePut    (    SM_PKT_DESC	*	pSmPktDesc,	/* ptr to shared memory descriptor */    SM_PKT *		pPkt		/* addr of packet to be returned */    )    {    SM_DESC *	pSmDesc = &pSmPktDesc->smDesc;    /* Check that this cpu is connected to shared memory */    if (pSmPktDesc->status != SM_CPU_ATTACHED)	{	errno = S_smPktLib_NOT_ATTACHED;	return (ERROR);				/* local cpu is not attached */	}    /* Check for null pointer */    if (pPkt == NULL)	{	errno = S_smPktLib_INVALID_PACKET;	return (ERROR);				/* null packet address */	}    /* Return packet to free list */    return (smPktSllPut (&(pSmPktDesc->hdrLocalAdrs->freeList), pSmDesc->base, 			 pSmDesc->tasRoutine, pSmDesc->tasClearRoutine, 			 &(pPkt->header.node), NULL));    }/******************************************************************************** smPktRecv - receive a packet sent via shared memory** This routine receives a shared memory packet which was queued to this CPU.* This routine should be called in response to an interrupt which notifies* this CPU of the packet, or it can be called repeatedly in a polling* fashion to check for input packets.  (NOTE: An interrupt will be generated* only if there previously was not a packet queued to this CPU.  Therefore,* after a packet is received, this routine should be called again to check* for more packets.)** Upon return, the location indicated by <ppPkt> will contain the address* of the received packet, or NULL if there was none.** RETURNS: OK, or ERROR.** ERRNO: S_smPktLib_NOT_ATTACHED*/STATUS smPktRecv    (    SM_PKT_DESC	*	pSmPktDesc,	/* shared memory descriptor */    SM_PKT **		ppPkt		/* location to put pkt addr */    )    {    SM_PKT_CPU_DESC volatile *	pPktCpuDesc;    STATUS			status;    SM_DESC *			pSmDesc = (SM_DESC *) &pSmPktDesc->smDesc;    int                         tmp;         /* temp storage */    /* Check that this cpu is connected to shared memory */    if (pSmPktDesc->status != SM_CPU_ATTACHED)	{	errno = S_smPktLib_NOT_ATTACHED;	return (ERROR);				/* local cpu is not attached */	}    /* Get packet (if any) from input list */    pPktCpuDesc = &((pSmPktDesc->cpuLocalAdrs) [pSmDesc->cpuNum]);    						/* get addr of cpu descriptor */    status = smPktSllGet (&(pPktCpuDesc->inputList), pSmDesc->base,    		      	  pSmDesc->tasRoutine, pSmDesc->tasClearRoutine, 			  (SM_SLL_NODE **) ppPkt);    if ((status == OK) && (*ppPkt != NULL))	{	(*ppPkt)->header.nBytes = ntohl ((*ppPkt)->header.nBytes);	(*ppPkt)->header.srcCpu = ntohl ((*ppPkt)->header.srcCpu);        CACHE_PIPE_FLUSH ();                    /* CACHE FLUSH   [SPR 68334] */        tmp = (*ppPkt)->header.srcCpu;		/* BRIDGE FLUSH  [SPR 68334] */	}    return (status);    }/******************************************************************************** smPktSllGet - get a shared memory node from a singly-linked list** This routine attempts to obtain a shared memory node from the* specified singly-linked list of nodes.  If a node is available,* the local address (for this CPU) of the node is placed in the* location specified by <pNodeLocalAdrs>.  If no node was available* from the list, a NULL is placed in this location.** This routine uses the specified test-and-set function, <tasRoutine>, to* obtain exclusive access to the linked list lock.  If the lock cannot* be acquired within the number of tries specified by the smPktTasTries* global variable, this routine will return ERROR.** RETURNS: OK, or ERROR if could not acquire list lock.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲成人自拍| 中文字幕一区二区三区四区不卡 | 91丨porny丨在线| 欧美日韩高清一区二区不卡| 久久日韩粉嫩一区二区三区| 一区二区三区四区五区视频在线观看| 免费人成精品欧美精品| 972aa.com艺术欧美| 国产调教视频一区| 麻豆精品一区二区| 欧美日韩视频在线观看一区二区三区 | 激情深爱一区二区| 欧美日韩一区视频| 亚洲视频在线一区观看| 国产精品综合在线视频| 日韩欧美国产一区二区在线播放| 综合av第一页| 99久久精品国产精品久久| 久久久亚洲午夜电影| 久久99精品国产| 欧美一区二区网站| 午夜精品在线看| 欧美日韩国产系列| 亚州成人在线电影| 欧美久久久久久久久| 亚洲国产乱码最新视频 | 粉嫩av亚洲一区二区图片| 日韩欧美电影在线| 麻豆国产欧美日韩综合精品二区| 欧美日韩在线精品一区二区三区激情| 亚洲色图视频网站| 色综合久久99| 一区2区3区在线看| 欧美色精品在线视频| 亚洲成人免费观看| 在线播放日韩导航| 美女网站色91| 欧美va亚洲va| 国产成人在线看| 国产精品美女久久久久久久久| 成人综合婷婷国产精品久久蜜臀 | 精品免费国产一区二区三区四区| 琪琪久久久久日韩精品| 日韩欧美一区二区不卡| 老司机午夜精品| 欧美激情一区在线| 91视频免费观看| 图片区小说区国产精品视频| 91麻豆精品国产91久久久久久 | 精品日韩一区二区| 国产一级精品在线| 国产精品久久久久天堂| 在线日韩国产精品| 日本不卡视频一二三区| 久久久久9999亚洲精品| 91看片淫黄大片一级在线观看| 亚洲成av人片| 国产无人区一区二区三区| av高清不卡在线| 香蕉成人伊视频在线观看| 精品91自产拍在线观看一区| 成人动漫在线一区| 爽好久久久欧美精品| 精品国产网站在线观看| 97se亚洲国产综合自在线观| 蜜桃av一区二区三区电影| 欧美国产精品久久| 欧美二区三区91| 国产成人免费视| 亚洲成av人影院| 欧美激情一区不卡| 欧美电影一区二区| 国产成人夜色高潮福利影视| 亚洲成av人在线观看| 国产精品女主播在线观看| 欧美日韩国产大片| 不卡视频在线观看| 麻豆一区二区99久久久久| 亚洲免费在线看| 久久综合九色综合97婷婷女人 | 午夜成人免费视频| 欧美国产乱子伦| 欧美大度的电影原声| 色8久久人人97超碰香蕉987| 国产一区二区三区在线观看免费视频| 一区二区三区在线视频观看 | 亚洲自拍另类综合| 久久精品人人做人人爽人人| 欧美日韩电影在线| 成人高清视频在线观看| 久草中文综合在线| 天天色综合成人网| 一区二区三区.www| 国产精品不卡一区二区三区| 国产三级一区二区| 欧美大片顶级少妇| 日韩一区二区三区av| 欧美日韩日日摸| 欧美艳星brazzers| 色综合久久久久网| 丁香激情综合国产| 国产在线精品免费| 欧美aaa在线| 午夜精品福利久久久| 亚洲一区二区三区四区在线观看| 国产精品麻豆视频| 中文字幕av一区 二区| 久久久久久麻豆| 久久亚洲一级片| 精品少妇一区二区三区日产乱码| 欧美精品v日韩精品v韩国精品v| 在线这里只有精品| 在线免费观看视频一区| 色婷婷综合激情| 欧美性受极品xxxx喷水| 91成人在线精品| 欧美日韩电影在线| 欧美一区二区在线免费观看| 7777精品久久久大香线蕉| 欧美午夜视频网站| 欧美日韩不卡一区| 日韩欧美中文字幕制服| 精品欧美一区二区三区精品久久| 日韩免费看网站| 久久人人97超碰com| 国产婷婷色一区二区三区四区| 亚洲国产精品精华液ab| 136国产福利精品导航| 亚洲在线视频网站| 视频一区免费在线观看| 蜜桃一区二区三区四区| 国产成人在线视频免费播放| 成人aa视频在线观看| 色婷婷国产精品久久包臀| 欧美日韩精品一区二区| 26uuu精品一区二区| 国产精品久久影院| 亚洲成人综合网站| 精品一区二区三区在线观看 | 91精品在线一区二区| 日韩欧美成人激情| 日本一区二区三区电影| 亚洲精品国产品国语在线app| 日日骚欧美日韩| 成人在线视频一区二区| 欧美午夜影院一区| 久久毛片高清国产| 一区二区三区鲁丝不卡| 视频一区二区三区中文字幕| 国产福利不卡视频| 欧美在线观看一区二区| 2022国产精品视频| 亚洲人成7777| 久久精品国产成人一区二区三区| 成人午夜视频在线观看| 欧美日韩国产精品自在自线| 国产女同互慰高潮91漫画| 亚洲1区2区3区视频| 国产福利精品一区| 3atv一区二区三区| 亚洲丝袜精品丝袜在线| 国产麻豆精品久久一二三| 欧美日韩免费电影| 中文字幕欧美国产| 蜜乳av一区二区| 欧洲亚洲国产日韩| 国产精品毛片高清在线完整版| 日韩av在线免费观看不卡| 91日韩在线专区| 久久久久国色av免费看影院| 日韩黄色免费网站| 色视频欧美一区二区三区| 国产亚洲精品资源在线26u| 天堂久久一区二区三区| 色综合视频一区二区三区高清| 2023国产精品| 日韩vs国产vs欧美| 欧美精品vⅰdeose4hd| 一区二区三区国产| 99在线精品免费| 欧美经典一区二区| 国产在线国偷精品免费看| 制服丝袜中文字幕一区| 亚洲综合视频网| 91美女福利视频| 国产精品美女久久久久久| 国产精品一二三四区| 日韩欧美成人午夜| 美国一区二区三区在线播放| 88在线观看91蜜桃国自产| 亚洲综合无码一区二区| 在线视频综合导航| 亚洲伦理在线精品| 色综合久久久久综合体桃花网| 中文字幕成人av| 不卡一区二区三区四区| 综合婷婷亚洲小说| 91麻豆免费视频| 亚洲精品videosex极品| 色成人在线视频|