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

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

?? mem.c

?? samsung 9908DVD源代碼,
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**********************************************************************************
 * mem.c
 * coded by hspark@ce.cnu.ac.kr
 * date : 2001/06/23
 * modified by hjahn@ce.cnu.ac.kr
 * date : 2003/03/03
 **********************************************************************************/


#include "kernel\\mk_sys.h"
#include "util\\mk_lib.h"
#include "kernel\\mk_mem.h"
#include "kernel\\mk_task.h"
#include "kernel\\mk_ddi.h"

struct mk_heap_struct *MK_pHeapListHead;
struct mk_heap_struct *MK_pHeapListTail;

struct mk_buffer_pool_struct *MK_pBufferPoolListHead;
struct mk_buffer_pool_struct *MK_pBufferPoolListTail;

VOID
MK_MemoryInitialize(VOID)
{
	MK_pHeapListHead = MK_NULL;
	MK_pHeapListTail = MK_NULL;
	MK_pBufferPoolListHead = MK_NULL;
	MK_pBufferPoolListTail = MK_NULL;
}

STATUS
MK_CreateHeapManager(MK_HEAP *pHeap, CHAR *pName, VOID *pAddr, unsigned long Length, ULONG MinSize, BOOLEAN Options)
{
	MK_MBLOCK	*pMBlock, *pRealBlock;
	INT			Flags;

	if(pHeap->h_Magic == MK_HEAP_MAGIC)
	{
#if MK_DEBUG_PRINT
		MK_Panic("MK_CreateHeapManager() - Magic error!\n");
#endif
		return MK_ERROR;
	}
	

	if((ULONG)pAddr & 1)	/* if pAddr isn't Word Align */
	{
#if MK_DEBUG_PRINT
		MK_InfoPrintf(MK_TASK_WARNING, "MK_CreateHeapManager() - It is not word align! Task(%s)\n", MK_GetCurrentTask()->t_pName);
#endif
		return MK_WORDALIGN_ERROR;
	}
	
	if(Length < sizeof(MK_MBLOCK)*2)
	{
#if MK_DEBUG_PRINT
		MK_InfoPrintf(MK_TASK_WARNING, "MK_CreateHeapManager() - Memory is not enough to create heap! Task(%s)\n", MK_GetCurrentTask()->t_pName);
#endif
		return MK_SMALLMEMORY_ERROR;
	}

	//MK_BlockCopy(pHeap->h_pName, pName, MK_NAME_MAX-1);
	//pHeap->h_pName[MK_NAME_MAX-1] = '\0';
	pHeap->h_pName = pName;

	/* Initialize Real Heap Area which will be allocated */
	pRealBlock = (MK_MBLOCK *)pAddr + 1;
	pRealBlock->mb_pNext = MK_NULL;
	pRealBlock->mb_Size = Length - sizeof(MK_MBLOCK);
	pRealBlock->mb_Magic  = (ULONG)pHeap;

	/* make a Head Memory Block which is not merged */
	pMBlock = (MK_MBLOCK *)pAddr;
	pMBlock->mb_Size = 0;
	pMBlock->mb_pNext = pRealBlock ;
	pMBlock->mb_Magic = (ULONG)pHeap;

	pHeap->h_StartofHeap = (ULONG)pAddr;
	pHeap->h_HeapSize = Length;
	pHeap->h_FreeSize = Length;
	pHeap->h_MinSize = MinSize > sizeof(MK_MBLOCK) ? MinSize : sizeof(MK_MBLOCK);
	pHeap->h_pFreeMBlockList = pMBlock;

#if 0
	pHeap->h_FreeMBlockList.mb_pNext = pMBlock;
	pHeap->h_FreeMBlockList.mb_Size = 0;		/* Prevent Header allocated */
#endif /* 0 */

	pHeap->h_Options = Options;

	MK_CreatePendingList(&pHeap->h_PendingList, Options);

	pHeap->h_Magic = MK_HEAP_MAGIC;

	Flags = MK_InterruptDisable();		/* Critical Region */

	pHeap->h_pNext = MK_NULL;
	pHeap->h_pPrev = MK_NULL;
	if(MK_pHeapListHead == MK_NULL)
	{
		MK_pHeapListHead = pHeap;
		MK_pHeapListTail = pHeap;
	}
	else
	{
		pHeap->h_pPrev = MK_pHeapListTail;
		MK_pHeapListTail->h_pNext = pHeap;
		MK_pHeapListTail = pHeap;
	}

	MK_InterruptRestore(Flags);

	return MK_NO_ERROR;
}

STATUS
MK_DeleteHeapManager(MK_HEAP *pHeap)
{
	INT Flags;

	if(pHeap->h_Magic != MK_HEAP_MAGIC)
	{
#if MK_DEBUG_PRINT
		MK_Panic("MK_DeleteHeapManager() - Magic Error! Task(%s)\n", MK_GetCurrentTask()->t_pName);
#endif
		return MK_RESOURCE_ERROR;
	}

	Flags = MK_InterruptDisable();		/* Critical Region */

	pHeap->h_Magic = 0;

	MK_ClearPendingList(&pHeap->h_PendingList);

	if(MK_pHeapListHead == MK_pHeapListTail)
	{
		MK_pHeapListHead = MK_NULL;
		MK_pHeapListTail = MK_NULL;
	}
	else
	{
		if(pHeap == MK_pHeapListHead)
		{
			MK_pHeapListHead = pHeap->h_pNext;
			MK_pHeapListHead->h_pPrev = MK_NULL;
		}
		else if(pHeap == MK_pHeapListTail)
		{
			MK_pHeapListTail = pHeap->h_pPrev;
			MK_pHeapListTail->h_pNext = MK_NULL;
		}
		else
		{
			pHeap->h_pPrev->h_pNext = pHeap->h_pNext;
			pHeap->h_pNext->h_pPrev = pHeap->h_pPrev;
		}
	}
	pHeap->h_pNext = MK_NULL;
	pHeap->h_pPrev = MK_NULL;

	MK_InterruptRestore(Flags);

	return MK_NO_ERROR;
}

STATUS
MK_ResetHeapManager(MK_HEAP *pHeap)
{
	MK_MBLOCK *pMBlock, *pRealBlock;
	INT	Flags;

	if(pHeap->h_Magic != MK_HEAP_MAGIC)
	{
#if MK_DEBUG_PRINT
		MK_Panic("MK_ResetHeapManager() - Magic error!\n");
#endif
		return MK_RESOURCE_ERROR;
	}
	
	Flags = MK_InterruptDisable();

	/* Initialize Real Heap Area which will be allocated */
	pRealBlock = (MK_MBLOCK *)pHeap->h_StartofHeap + 1;
	pRealBlock->mb_pNext = MK_NULL;
	pRealBlock->mb_Size = pHeap->h_HeapSize - sizeof(MK_MBLOCK);
	pRealBlock->mb_Magic  = (ULONG)pHeap;

	/* make a Head Memory Block which is not merged */
	pMBlock = (MK_MBLOCK *)pHeap->h_StartofHeap;
	pMBlock->mb_Size = 0;
	pMBlock->mb_pNext = pRealBlock ;
	pMBlock->mb_Magic = (ULONG)pHeap;

	pHeap->h_pFreeMBlockList = pMBlock;

	MK_ClearPendingList(&pHeap->h_PendingList);
	
	MK_InterruptRestore( Flags );
	return MK_NO_ERROR;
}

static STATUS 
MK_GetMemoryInternal(MK_HEAP *pHeap, VOID **pAddr, ULONG Size)
{
	MK_MBLOCK *pPrev, *pNext, *pLeft;
	MK_MBLOCK_DUMMY *pInfo;
	ULONG AllocSize;
	int Flags;

	Flags = MK_InterruptDisable();
	
	if(Size < pHeap->h_MinSize)
	{
		AllocSize = pHeap->h_MinSize;
	}
	else
	{
		AllocSize = Size;
	}
	AllocSize += sizeof(MK_MBLOCK_DUMMY);
	AllocSize = MK_RoundWord(AllocSize);

	/* First Fit Algorithm */
	pPrev = pHeap->h_pFreeMBlockList;
	pNext = pPrev->mb_pNext;

#if 0
	for( ; pNext != MK_NULL; pPrev = pNext, pNext = pNext->mb_pNext)
	{
		if( ( pNext->mb_Size > AllocSize ) && ( pNext->mb_Size <= AllocSize + sizeof(MK_MBLOCK)) )
		{
			AllocSize = pNext->mb_Size;
			pPrev->mb_pNext = pNext->mb_pNext;
			pInfo = (MK_MBLOCK_DUMMY *)pNext;
			pInfo->md_pHeap = pHeap;
			pInfo->md_Size = AllocSize;
			*pAddr = (VOID *)(pInfo+1);

			MK_InterruptRestore(Flags);
			return MK_NO_ERROR;
		}
		else if( pNext->mb_Size > AllocSize + sizeof(MK_MBLOCK) )
		{
			pLeft = (MK_MBLOCK *)( (UINT)pNext + AllocSize );
			pPrev->mb_pNext = pLeft;
			pLeft->mb_Magic = (UINT)pHeap;
			pLeft->mb_pNext = pNext->mb_pNext;
			pLeft->mb_Size = pNext->mb_Size - AllocSize;
			pInfo = (MK_MBLOCK_DUMMY *)pNext;
			pInfo->md_pHeap = pHeap;
			pInfo->md_Size = AllocSize;
			*pAddr = (VOID *)(pInfo + 1);

			MK_InterruptRestore(Flags);
			return MK_NO_ERROR;
		}
	}
#else 

	for( ; pNext != MK_NULL; pPrev = pNext, pNext = pNext->mb_pNext)
	{
		if( pNext->mb_Size > AllocSize ) 
		{
			if( pNext->mb_Size <= AllocSize + sizeof(MK_MBLOCK)) 
			{
				AllocSize = pNext->mb_Size;
				pPrev->mb_pNext = pNext->mb_pNext;
				pInfo = (MK_MBLOCK_DUMMY *)pNext;
				pInfo->md_pHeap = pHeap;
				pInfo->md_Size = AllocSize;
				*pAddr = (VOID *)(pInfo+1);

				MK_InterruptRestore(Flags);
				return MK_NO_ERROR;
			}
		    else 
			{
				pLeft = (MK_MBLOCK *)( (ULONG)pNext + AllocSize );
				pPrev->mb_pNext = pLeft;
				pLeft->mb_Magic = (ULONG)pHeap;
				pLeft->mb_pNext = pNext->mb_pNext;
				pLeft->mb_Size = pNext->mb_Size - AllocSize;
				pInfo = (MK_MBLOCK_DUMMY *)pNext;
				pInfo->md_pHeap = pHeap;
				pInfo->md_Size = AllocSize;
				*pAddr = (VOID *)(pInfo + 1);

				MK_InterruptRestore(Flags);
				return MK_NO_ERROR;
			}
		}
	}
#endif

	*pAddr = 0;

#if MK_DEBUG_PRINT
	MK_InfoPrintf(MK_TASK_WARNING, "MK_GetMemoryInternal() - Memory is not allocated! Task(%s)\n", MK_GetCurrentTask()->t_pName);
#endif

	MK_InterruptRestore(Flags);
	
	return MK_ERROR;
}

STATUS
MK_GetMemory(MK_HEAP *pHeap, VOID **pAddr, ULONG Size, LONG Ticks)
{
	MK_TASK *pTask;
	STATUS	Status;
	INT		Flags;

	if(pHeap->h_Magic != MK_HEAP_MAGIC)
	{
		*pAddr = 0;
#if MK_DEBUG_PRINT
		MK_Panic("MK_GetMemory() - Magic Error! Task(%s)\n", MK_GetCurrentTask()->t_pName);
#endif
		return MK_RESOURCE_ERROR;
	}

	Flags = MK_InterruptDisable();		/* Critical Region */
	
	Status = MK_GetMemoryInternal(pHeap, pAddr, Size);
	if( Status >= 0 )
	{
		MK_InterruptRestore(Flags);
		return Status;
	}

	if(Ticks == MK_NO_WAIT)
	{
		MK_KernelInfoPrintf((MK_TASK_WARNING, "MK_GetMemory() - Memory is not allocated(MK_TIMEOUT)! Task(%s)\n",
						MK_GetCurrentTask()->t_pName));
		MK_InterruptRestore(Flags);
		return MK_TIMEOUT;
	}

	pTask = MK_GetCurrentTask();
	pTask->t_pendingMemSize = (ULONG)Size;

	MK_DeleteTaskFromReadyList(pTask);
	MK_InsertTaskToPendingList(&pHeap->h_PendingList, pTask);
	if(Ticks > 0)
	{
		MK_InsertTaskToDelayedList(pTask, Ticks);
	}

	MK_Schedule();

	if(pTask->t_Status & MK_TASK_FORCED)
	{
		pTask->t_Status &= ~MK_TASK_FORCED;

		MK_KernelInfoPrintf((MK_TASK_WARNING, "MK_GetMemory() - Heap is deleted by force! Task(%s)\n",
					MK_GetCurrentTask()->t_pName));
		MK_InterruptRestore(Flags);
		return MK_RESOURCE_ERROR;
	}
	/* When this Task is released */

	if(pTask->t_Status & MK_TASK_PENDING)	/* released by TIMEOUT */
	{
		MK_DeleteTaskFromPendingList(&pHeap->h_PendingList, pTask);

		MK_KernelInfoPrintf((MK_TASK_WARNING, "MK_GetMemory() - Memory is not allocated by timeout! Task(%s)\n", MK_GetCurrentTask()->t_pName));
		MK_InterruptRestore(Flags);
		return MK_TIMEOUT;
	}
	/* else can Get the Meomry */
	Status = MK_GetMemoryInternal(pHeap, pAddr, Size);

#if 1
	pTask = MK_GetFirstPendingTask(&pHeap->h_PendingList);
	if(MK_GetHeapMaxMemorySize(pHeap) >= (ULONG)pTask->t_pendingMemSize)
	{
		MK_DeleteTaskFromPendingList(&pHeap->h_PendingList, pTask);
		if(pTask->t_Status & MK_TASK_DELAYED)
		{
			MK_DeleteTaskFromDelayedList(pTask);
		}
		MK_InsertTaskToReadyList(pTask);
	}
#endif

	MK_InterruptRestore(Flags);
	return Status;
}

UINT
MK_GetHeapMaxMemorySize(MK_HEAP *pHeap)
{
	MK_MBLOCK *pMBlock;
	UINT	MaxSize = 0;
	INT		flag;

	if(pHeap->h_Magic != MK_HEAP_MAGIC)
	{
#if MK_DEBUG_PRINT
		MK_Panic("MK_GetHeapMaxMemorySize() - Magic Error! Task(%s)\n", MK_GetCurrentTask()->t_pName);
#endif
		return 0;
	}

	flag = MK_InterruptDisable();

	pMBlock = pHeap->h_pFreeMBlockList->mb_pNext;
	while(pMBlock != 0)
	{
		MaxSize = (MaxSize >= pMBlock->mb_Size) ? MaxSize : pMBlock->mb_Size;
		pMBlock = pMBlock->mb_pNext;
	}
	
	MK_InterruptRestore(flag);
	return MaxSize;
}

static STATUS 
MK_FreeMemoryInternal(MK_HEAP *pHeap, VOID *pAddr, ULONG AllocSize, ULONG *pMergedSize)
{
	MK_MBLOCK *pPrev, *pNext;
	MK_MBLOCK *pMBlock;
	ULONG	Top;
	INT		Flags;

	Flags = MK_InterruptDisable();
	
	pPrev = pHeap->h_pFreeMBlockList;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
972aa.com艺术欧美| 久久精品国产免费| 95精品视频在线| 亚洲欧洲日本在线| 在线观看成人小视频| 亚洲一区二区三区四区不卡| 欧美日韩一区二区三区高清 | 久久久国产精品不卡| 国产麻豆91精品| 中文字幕av资源一区| 色乱码一区二区三区88| 日韩国产欧美视频| www国产成人| 91玉足脚交白嫩脚丫在线播放| 亚洲最新在线观看| 欧美一卡二卡在线观看| 福利视频网站一区二区三区| 亚洲四区在线观看| 在线观看91精品国产麻豆| 国产精品影视在线观看| 亚洲免费观看高清完整| 欧美一区二区三区免费观看视频| 精品一区精品二区高清| 亚洲视频一区二区在线观看| 欧美精品123区| 成人激情免费电影网址| 首页国产欧美久久| 国产精品天天看| 欧美三级乱人伦电影| 经典三级视频一区| 一区二区三区日韩精品| 日韩一级黄色片| 菠萝蜜视频在线观看一区| 日韩av中文字幕一区二区三区| 精品播放一区二区| 在线视频欧美区| 成人夜色视频网站在线观看| 亚洲chinese男男1069| 欧美国产日韩亚洲一区| 制服丝袜日韩国产| 91免费看`日韩一区二区| 久久草av在线| 天天av天天翘天天综合网| 国产精品乱子久久久久| 日韩欧美国产三级| 欧美性猛片xxxx免费看久爱| 国产精品1区二区.| 免费观看久久久4p| 亚洲午夜精品网| 国产精品伦一区| 久久综合狠狠综合久久综合88 | 国产精品久久久久一区二区三区共| 欧美日韩亚洲综合| 精品少妇一区二区三区免费观看 | 亚洲精品视频在线看| 久久久精品日韩欧美| 欧美一区二区高清| 欧美日本在线观看| 欧美日韩国产一级二级| 色欧美乱欧美15图片| youjizz久久| 成人综合在线观看| 成人一二三区视频| 国产成人亚洲综合色影视| 精品中文av资源站在线观看| 日韩精品亚洲一区| 日韩专区一卡二卡| 午夜免费欧美电影| 亚洲444eee在线观看| 一区二区三区四区在线免费观看| 国产精品日韩精品欧美在线 | 国产精品视频一二三| 久久男人中文字幕资源站| 337p日本欧洲亚洲大胆色噜噜| 欧美精品免费视频| 精品婷婷伊人一区三区三| 色一情一乱一乱一91av| 在线观看成人小视频| 91国产成人在线| 欧美三级电影在线看| 欧美日韩国产在线观看| 欧美久久久一区| 日韩一区二区中文字幕| 日韩视频在线你懂得| 久久婷婷国产综合精品青草| 久久久综合精品| 国产精品家庭影院| 亚洲乱码日产精品bd| 亚洲综合自拍偷拍| 日韩国产欧美一区二区三区| 免费在线看一区| 国产在线国偷精品产拍免费yy| 国产高清在线观看免费不卡| 精品综合免费视频观看| 国产精品一区一区三区| 国产福利一区在线| 97久久超碰国产精品| 欧美主播一区二区三区| 日韩精品一区二区三区老鸭窝 | 国产精品毛片大码女人| 玉足女爽爽91| 麻豆国产精品一区二区三区| 国产真实乱偷精品视频免| 极品销魂美女一区二区三区| 国产麻豆视频一区| 色综合久久精品| 欧美久久久久中文字幕| 久久久久久99精品| 亚洲一区二区精品视频| 免费在线观看不卡| 成人国产精品免费网站| 日本丶国产丶欧美色综合| 日韩欧美激情在线| 综合久久国产九一剧情麻豆| 亚洲 欧美综合在线网络| 久久成人久久爱| 色域天天综合网| 日韩欧美国产一二三区| 亚洲精品免费在线播放| 精品一区二区三区不卡 | 老司机午夜精品| 成人免费视频一区二区| 在线不卡一区二区| 欧美国产一区二区在线观看 | 精品日韩在线一区| 亚洲一区二区三区在线看 | av午夜精品一区二区三区| 欧美猛男gaygay网站| 亚洲国产精品激情在线观看| 亚洲电影一级片| 99久久久国产精品免费蜜臀| 欧美第一区第二区| 亚洲免费观看高清完整版在线观看熊| 麻豆久久一区二区| 欧美日韩综合在线免费观看| 久久精品欧美日韩| 麻豆精品视频在线观看| 欧美日韩亚洲综合| 亚洲欧美日韩国产综合在线| 国产一区中文字幕| 日韩一二三四区| 亚洲一二三级电影| 99国产精品久| 国产精品视频看| 福利电影一区二区| 久久色视频免费观看| 蜜臀99久久精品久久久久久软件| 色视频成人在线观看免| 中文字幕乱码一区二区免费| 精品一区二区影视| 欧美成人一区二区三区片免费| 亚洲一区在线观看免费| 96av麻豆蜜桃一区二区| 一区二区中文字幕在线| 成人午夜视频网站| 欧美激情在线观看视频免费| 国产剧情一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美aa在线视频| 日韩欧美成人午夜| 久久精品国产成人一区二区三区| 91精品欧美综合在线观看最新| 亚洲一区av在线| 欧美最新大片在线看| 国产精品久久久一本精品| 成人精品国产福利| 亚洲丝袜精品丝袜在线| 91亚洲精华国产精华精华液| 亚洲同性gay激情无套| 91小视频免费观看| 亚洲激情综合网| 欧美日韩在线三级| 免费一级欧美片在线观看| 日韩精品一区二区三区视频播放| 欧美丰满美乳xxx高潮www| 亚洲福利电影网| 日韩午夜激情视频| 国产麻豆成人精品| 国产精品福利一区二区| 91久久久免费一区二区| 亚洲国产视频一区二区| 91精品国产综合久久福利| 久久99久久久久| 国产欧美日韩激情| 91捆绑美女网站| 婷婷中文字幕综合| 久久综合九色综合97婷婷女人 | 99久久免费精品| 亚洲一区二区在线播放相泽| 欧美一区二区三区思思人| 极品美女销魂一区二区三区免费| 欧美国产日韩a欧美在线观看| 一本色道**综合亚洲精品蜜桃冫| 亚洲福中文字幕伊人影院| 精品国产一二三区| 色综合久久天天| 精品综合免费视频观看| 亚洲女人小视频在线观看| 正在播放亚洲一区| 成人午夜短视频|