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

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

?? mempartlib.c

?? VxWorks操作系統內核源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
    /* partition is local */    if (OBJ_VERIFY (partId, memPartClassId) != OK)	return (ERROR);    if (pBlock == NULL)	return (OK);				/* ANSI C compatibility */    pHdr   = BLOCK_TO_HDR (pBlock);    /* get exclusive access to the partition */    semTake (&partId->sem, WAIT_FOREVER);    /* optional check for validity of block */    if ((partId->options & MEM_BLOCK_CHECK) &&        !memPartBlockIsValid (partId, pHdr, FALSE))	{	semGive (&partId->sem);			/* release mutual exclusion */	if (memPartBlockErrorRtn != NULL)	    (* memPartBlockErrorRtn) (partId, pBlock, "memPartFree");	if (partId->options & MEM_BLOCK_ERROR_SUSPEND_FLAG)	    {	    if ((taskIdCurrent->options & VX_UNBREAKABLE) == 0)		taskSuspend (0);	    }	errnoSet (S_memLib_BLOCK_ERROR);	return (ERROR);	}#ifdef WV_INSTRUMENTATION    EVT_OBJ_3 (OBJ, partId, memPartClassId, EVENT_MEMFREE, partId, pBlock, 2 * (pHdr->nWords));#endif    nWords = pHdr->nWords;     /* check if we can coalesce with previous block;     * if so, then we just extend the previous block,     * otherwise we have to add this as a new free block */    if (PREV_HDR (pHdr)->free)	{	pHdr->free = FALSE;	                /* this isn't a free block */	pHdr = PREV_HDR (pHdr);			/* coalesce with prev block */	pHdr->nWords += nWords;	}    else	{	pHdr->free = TRUE;			/* add new free block */	dllInsert (&partId->freeList, (DL_NODE *) NULL, HDR_TO_NODE (pHdr));	}    /* check if we can coalesce with next block;     * if so, then we can extend our block delete next block from free list */    pNextHdr = NEXT_HDR (pHdr);    if (pNextHdr->free)	{	pHdr->nWords += pNextHdr->nWords;	/* coalesce with next */	dllRemove (&partId->freeList, HDR_TO_NODE (pNextHdr));	}    /* fix up prev info of whatever block is now next */    NEXT_HDR (pHdr)->pPrevHdr = pHdr;    /* adjust allocation stats */    partId->curBlocksAllocated--;    partId->curWordsAllocated -= nWords;    semGive (&partId->sem);    return (OK);    }/********************************************************************************* memPartBlockIsValid - check validity of block** This routine checks the validity of a block. If the pointer to the block* header is bogus we could run into bus errors and the calling task could take* the partId semaphore with it. To prvent this from happening we make the task* preemption proof and release the semaphore before doing the block validity * check. ** NOMANUAL*/BOOL memPartBlockIsValid     (    PART_ID partId,    FAST BLOCK_HDR *pHdr,    BOOL isFree                 /* expected status */    )    {    BOOL valid;    TASK_LOCK ();					/* LOCK PREEMPTION */    semGive (&partId->sem);				/* release mutex */    valid = MEM_ALIGNED (pHdr)				/* aligned */            && MEM_ALIGNED (2 * pHdr->nWords)		/* size is round */            && (pHdr->nWords <= partId->totalWords)	/* size <= total */	    && (pHdr->free == isFree)			/* right alloc-ness */#if (CPU_FAMILY == SH)	    && MEM_ALIGNED(NEXT_HDR (pHdr))		/* aligned(08aug95,sa)*/	    && MEM_ALIGNED(PREV_HDR (pHdr))		/* aligned(08aug95,sa)*/#endif	    && (pHdr == PREV_HDR (NEXT_HDR (pHdr)))	/* matches next block */	    && (pHdr == NEXT_HDR (PREV_HDR (pHdr)));	/* matches prev block */    semTake (&partId->sem, WAIT_FOREVER);		/* reacquire mutex */    TASK_UNLOCK ();					/* UNLOCK PREEMPTION */    return (valid);    }/******************************************************************************* memAlignedBlockSplit - split a block on the free list into two blocks** This routine is like memBlockSplit, but also aligns the data block to the* given alignment.  The block looks like this after it is split:**        |----------------------------------------------------------------|*        ^                      ^                       ^                 ^*        |                      |                       | space left over |*        |                      |<------- nWords ------>| after alignment |*        |                      |                       |                 |*   block begin       new aligned buffer begin         end           block end*** After the split, if the first block has less than minWords in it, the* block is rejected, and null is returned, since we can't place this first* block on the free list.* If the space succeeding the newly allocated aligned buffer is less than the* minimum block size, then the bytes are added to the newly allocated buffer.* If the space is greater than the minimum block size,  then a new memory* fragment is created and added to the free list.* Care must be taken to insure that the orignal block passed in* to be split has at least (nWords + alignment/2) words in it.  * If the block has exactly nWords and is already aligned to the given alignment,* it will be deleted from the free list and returned unsplit.* Otherwise, the second block will be returned.** RETURNS: A pointer to a BLOCK_HDR */LOCAL BLOCK_HDR *memAlignedBlockSplit     (    PART_ID partId,    FAST BLOCK_HDR *pHdr,    FAST unsigned nWords,            /* number of words in second block */    unsigned minWords,               /* min num of words allowed in a block */    unsigned alignment		     /* boundary to align to */    )    {    FAST BLOCK_HDR *pNewHdr;    FAST BLOCK_HDR *pNextHdr;    FAST char *endOfBlock;    FAST char *pNewBlock;    int blockSize;    /* calculate end of pHdr block */    endOfBlock = (char *) pHdr + (pHdr->nWords * 2);     /* caluclate unaligned beginning of new block */     pNewBlock = (char *) ((unsigned) endOfBlock - 		((nWords - sizeof (BLOCK_HDR) / 2) * 2));    /* align the beginning of the block */    pNewBlock = (char *)((unsigned) pNewBlock & ~(alignment - 1));    pNewHdr = BLOCK_TO_HDR (pNewBlock);    /* adjust original block's word count */    blockSize = ((char *) pNewHdr - (char *) pHdr) / 2;    if (blockSize < minWords)	{	/* check to see if the new block is the same as the original block -	 * if so, delete if from the free list.  If not, reject the newly	 * split block because it's too small to hang on the free list.	 */	if (pNewHdr == pHdr)	    dllRemove (&partId->freeList, HDR_TO_NODE (pHdr));	else	    return (NULL);	}    else	{	pNewHdr->pPrevHdr = pHdr;	pHdr->nWords = blockSize;	}    /* check to see if space left over after we aligned the new buffer     * is big enough to be a fragment on the free list.     */    if (((UINT) endOfBlock - (UINT) pNewHdr - (nWords * 2)) < (minWords * 2))	{	/* nope - give all the memory to the newly allocated block */	pNewHdr->nWords = (endOfBlock - pNewBlock + sizeof (BLOCK_HDR)) / 2;	pNewHdr->free     = TRUE; 	/* fix next block to point to newly allocated block */	NEXT_HDR (pNewHdr)->pPrevHdr = pNewHdr;	}    else	{	/* the extra bytes are big enough to be a fragment on the free list -	 * first, fix up the newly allocated block.	 */	pNewHdr->nWords = nWords;	pNewHdr->free     = TRUE; 	/* split off the memory after pNewHdr and add it to the free list */	pNextHdr = NEXT_HDR (pNewHdr);	pNextHdr->nWords = ((UINT) endOfBlock - (UINT) pNextHdr) / 2;	pNextHdr->pPrevHdr = pNewHdr;	pNextHdr->free = TRUE;	dllAdd (&partId->freeList, HDR_TO_NODE (pNextHdr));		/* fix next block to point to the new fragment on the free list */	NEXT_HDR (pNextHdr)->pPrevHdr = pNextHdr;	}    return (pNewHdr);    }/******************************************************************************** memAddToPool - add memory to the system memory partition** This routine adds memory to the system memory partition, after the initial* allocation of memory to the system memory partition.** RETURNS: N/A** SEE ALSO: memPartAddToPool()*/void memAddToPool     (    FAST char *pPool,           /* pointer to memory block */    FAST unsigned poolSize      /* block size in bytes */    )    {    (void) memPartAddToPool (&memSysPartition, pPool, poolSize);    }/********************************************************************************* malloc - allocate a block of memory from the system memory partition (ANSI)** This routine allocates a block of memory from the free list.  The size of* the block will be equal to or greater than <nBytes>.** RETURNS: A pointer to the allocated block of memory, or a null pointer if* there is an error.** SEE ALSO: * .I "American National Standard for Information Systems -"* .I "Programming Language - C, ANSI X3.159-1989: General Utilities (stdlib.h)"*/void *malloc     (    size_t nBytes             /* number of bytes to allocate */    )    {    return (memPartAlloc (&memSysPartition, (unsigned) nBytes));    }/********************************************************************************* free - free a block of memory (ANSI)** This routine returns to the free memory pool a block of memory previously* allocated with malloc() or calloc().** RETURNS: N/A** SEE ALSO: * malloc(), calloc(),* .I "American National Standard for Information Systems -"* .I "Programming Language - C, ANSI X3.159-1989: General Utilities (stdlib.h)"*/void free     (    void *ptr       /* pointer to block of memory to free */    )    {    (void) memPartFree (&memSysPartition, (char *) ptr);    }/********************************************************************************* memPartSemInit - initialize the partition semaphore as type binary** This routine initializes the partition semaphore as a binary semaphore.* This function is called indirectly from memPartInit().  This coupling* allows alternative semaphore types to serve as the basis for memory* partition interlocking.*/LOCAL void memPartSemInit    (    PART_ID partId		/* partition to initialize semaphore for */    )    {    semBInit (&partId->sem, SEM_Q_PRIORITY, SEM_FULL);    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区 在线观看视频| 51精品国自产在线| 99re8在线精品视频免费播放| 色综合天天综合狠狠| 欧美日韩国产一级二级| 国产a区久久久| 欧美日韩国产成人在线免费| 久久这里只有精品视频网| 综合在线观看色| 蜜臂av日日欢夜夜爽一区| 成人动漫在线一区| 日韩精品自拍偷拍| 亚洲男人电影天堂| 国产成人一区在线| 91精品欧美久久久久久动漫| 精品国一区二区三区| 一区二区在线观看免费| 蜜臀av性久久久久蜜臀av麻豆 | 偷拍日韩校园综合在线| 国产成人欧美日韩在线电影| 91理论电影在线观看| 欧美成人精品二区三区99精品| 欧美激情综合网| 久久精品99国产国产精| 91视频在线观看免费| 91精品一区二区三区久久久久久 | 日本一区二区视频在线| 天天色天天操综合| 91美女片黄在线| 久久久久久久久久久电影| 亚洲超碰97人人做人人爱| av中文字幕不卡| 精品国产乱码久久久久久浪潮| 一区二区在线观看视频在线观看| 粉嫩一区二区三区在线看| 日韩视频不卡中文| 日韩精品一卡二卡三卡四卡无卡| 欧美自拍偷拍一区| 亚洲天堂成人网| 国产一区二区中文字幕| 日韩一级完整毛片| 天堂成人国产精品一区| 色婷婷国产精品| |精品福利一区二区三区| 成人av在线播放网址| 精品国产一二三| 精品一区二区在线看| 日韩一区二区免费在线观看| 日韩专区在线视频| 欧美精品日韩精品| 免费欧美在线视频| 91精品在线麻豆| 久久精品国产久精国产爱| 欧美一区二区女人| 精品影视av免费| 久久久久久免费| 风间由美性色一区二区三区| 亚洲国产高清在线| 99久久夜色精品国产网站| 亚洲精品乱码久久久久| 在线观看av一区| 日韩av中文在线观看| 欧美精三区欧美精三区| 亚洲线精品一区二区三区八戒| 欧美三级电影精品| 麻豆成人在线观看| 国产天堂亚洲国产碰碰| 色成人在线视频| 日韩黄色免费电影| 欧美午夜电影一区| 日韩高清国产一区在线| 欧美va亚洲va| 国产69精品久久99不卡| 亚洲女女做受ⅹxx高潮| 欧美日韩精品免费观看视频| 天堂在线一区二区| www久久精品| 色婷婷狠狠综合| 亚洲一二三四在线| 日韩一级在线观看| 成人av在线影院| 天天射综合影视| 欧美激情一区二区三区在线| 色婷婷综合久久久中文一区二区| 亚洲精品日日夜夜| 欧美v亚洲v综合ⅴ国产v| 成人激情免费电影网址| 亚洲成人福利片| 国产目拍亚洲精品99久久精品| 色婷婷综合激情| 91精品国产一区二区三区蜜臀| 国产在线精品一区二区夜色 | 波多野结衣的一区二区三区| 一区二区三区在线视频免费 | 一区二区在线看| 久久综合狠狠综合| 在线免费亚洲电影| 精品一区二区在线看| 亚洲精品欧美专区| 精品电影一区二区三区| 色视频一区二区| 国产精品一区二区在线观看不卡| 亚洲综合偷拍欧美一区色| 久久精品一区蜜桃臀影院| 欧美日韩国产成人在线91| 成人一区二区三区在线观看| 国产精品一区免费视频| 狠狠狠色丁香婷婷综合久久五月| 日本午夜精品视频在线观看| 日韩成人精品在线| 午夜精品久久久| 日韩制服丝袜先锋影音| 亚洲国产视频a| 亚洲一区二区精品视频| 亚洲国产精品久久一线不卡| 洋洋av久久久久久久一区| 亚洲综合成人在线| 一区二区三区在线免费播放| 亚洲一区中文在线| 图片区日韩欧美亚洲| 免费成人在线网站| 韩国毛片一区二区三区| 国产伦精品一区二区三区视频青涩| 激情综合网激情| 国产麻豆精品95视频| 成人av在线看| 欧美性淫爽ww久久久久无| 欧美日韩亚洲另类| 欧美一区二区三区精品| 欧美精品一区二区在线播放| 欧美激情一区在线| 一片黄亚洲嫩模| 亚洲成国产人片在线观看| 日本欧美一区二区三区| 韩国欧美国产1区| 成人av在线电影| 色视频欧美一区二区三区| 欧美一区二区三区男人的天堂 | 欧美日韩在线播放三区四区| 日韩女优电影在线观看| 欧美激情自拍偷拍| 亚洲成人免费在线| 韩国一区二区三区| av激情综合网| 91麻豆精品国产自产在线 | 欧美日韩激情一区二区三区| 日韩欧美国产三级| 国产视频一区在线播放| 一区二区三区日韩精品视频| 日本一道高清亚洲日美韩| 国产99一区视频免费| 欧美午夜电影网| 久久精品视频在线看| 亚洲一区二区3| 国产精品影视网| 欧美日韩另类国产亚洲欧美一级| 久久久亚洲国产美女国产盗摄| 亚洲蜜臀av乱码久久精品| 蜜臀av性久久久久蜜臀aⅴ四虎 | 不卡的av网站| 日韩一区二区三区免费看| 欧美国产1区2区| 蜜乳av一区二区| 在线视频中文字幕一区二区| 国产日韩欧美麻豆| 青青青爽久久午夜综合久久午夜 | 亚洲精品视频观看| 国产乱一区二区| 91精品午夜视频| 亚洲综合丝袜美腿| av中文字幕亚洲| 国产日韩精品一区| 免费成人小视频| 欧美日韩国产天堂| 亚洲精品国产一区二区三区四区在线 | 视频一区国产视频| 99re66热这里只有精品3直播| 26uuu国产日韩综合| 奇米一区二区三区| 欧洲生活片亚洲生活在线观看| 国产精品免费av| 国产风韵犹存在线视精品| 日韩一区二区三区三四区视频在线观看| 一区二区三区四区高清精品免费观看 | 热久久久久久久| 欧美高清你懂得| 一区二区三区欧美亚洲| 国产成人av影院| 国产午夜亚洲精品午夜鲁丝片| 免播放器亚洲一区| 欧美一级黄色大片| 日韩电影在线一区二区| 欧美自拍丝袜亚洲| 一区二区三区四区蜜桃| 一本色道a无线码一区v| 悠悠色在线精品| 欧美视频一区二区三区| 亚洲成人精品一区| 欧美日韩大陆一区二区| 无码av免费一区二区三区试看|