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

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

?? heap.cpp

?? 小型的操作系統開發的原代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
				lpTmpHeader->lpNext = lpFreeBlock->lpNext;
				lpTmpHeader->lpPrev = lpFreeBlock->lpPrev;
				lpTmpHeader->lpNext->lpPrev = lpTmpHeader;
				lpTmpHeader->lpPrev->lpNext = lpTmpHeader;

				lpFreeBlock->dwBlockSize = dwSize;
				lpFreeBlock->dwFlags     |= BLOCK_FLAGS_USED;
				lpFreeBlock->dwFlags     &= ~BLOCK_FLAGS_FREE;  //Clear the free flags.
				lpFreeBlock->lpPrev      = NULL;
				lpFreeBlock->lpNext      = NULL;
				lpResult                 = (LPVOID)((DWORD)lpFreeBlock
					+ sizeof(__FREE_BLOCK_HEADER));
				goto __TERMINAL;
			}
			else  //Now need to split,return the block is OK.
			{
				//
				//Delete the free block from free block list.
				//
				lpFreeBlock->lpNext->lpPrev = lpFreeBlock->lpPrev;
				lpFreeBlock->lpPrev->lpNext = lpFreeBlock->lpNext;
				lpFreeBlock->dwFlags        |= BLOCK_FLAGS_USED;
				lpFreeBlock->dwFlags        &= ~BLOCK_FLAGS_FREE;  //Clear free bit.
				lpFreeBlock->lpNext         = NULL;
				lpFreeBlock->lpPrev         = NULL;
				lpResult = (LPVOID)((DWORD)lpFreeBlock + sizeof(__FREE_BLOCK_HEADER));
				goto __TERMINAL;
			}
		}
		lpFreeBlock = lpFreeBlock->lpNext;  //Check the next block.
	}
	if(lpResult)    //Have found a block.
		goto __TERMINAL;
	//
	//If can not find a statisfying block in above process,we should allocate a
	//new virtual area according to dwSize,insert the virtual area into free list,
	//then repeat above process.
	//
	lpVirtualArea = (__VIRTUAL_AREA_NODE*)GET_KERNEL_MEMORY(sizeof(__VIRTUAL_AREA_NODE));
	if(NULL == lpVirtualArea)  //Can not allocate kernel memory.
		goto __TERMINAL;
	lpVirtualArea->dwAreaSize     = ((dwSize + sizeof(__FREE_BLOCK_HEADER))
		> DEFAULT_VIRTUAL_AREA_SIZE) ?
		(dwSize + sizeof(__FREE_BLOCK_HEADER)) : DEFAULT_VIRTUAL_AREA_SIZE;

	lpVirtualArea->lpStartAddress = GET_VIRTUAL_AREA(lpVirtualArea->dwAreaSize);
	if(NULL == lpVirtualArea->lpStartAddress)  //Can not get virtual area.
	{
		RELEASE_KERNEL_MEMORY((LPVOID)lpVirtualArea);
		goto __TERMINAL;
	}
	//
	//Insert the virtual area node object into virtual area list
	//of current heap object.
	//
	lpVirtualArea->lpNext       = lpHeapObject->lpVirtualArea;
	lpHeapObject->lpVirtualArea = lpVirtualArea;
	//
	//Now,insert the free block(virtual area) into free list of the
	//heap object.
	//
	lpTmpHeader = (__FREE_BLOCK_HEADER*)lpVirtualArea->lpStartAddress;
	lpTmpHeader->dwFlags |= BLOCK_FLAGS_FREE;
	lpTmpHeader->dwFlags &= ~BLOCK_FLAGS_USED;  //Clear the used flags.
	lpTmpHeader->dwBlockSize = lpVirtualArea->dwAreaSize - sizeof(__FREE_BLOCK_HEADER);

	lpTmpHeader->lpNext  = lpHeapObject->FreeBlockHeader.lpNext;
	lpTmpHeader->lpPrev  = &lpHeapObject->FreeBlockHeader;
	lpTmpHeader->lpNext->lpPrev = lpTmpHeader;
	lpTmpHeader->lpPrev->lpNext = lpTmpHeader;
	//
	//Now,call HeapAlloc again,this time must successful.
	//
	lpResult = HeapAlloc(lpHeapObject,dwSize);

__TERMINAL:
	return lpResult;
}

//
//The following routine is a helper routine,used to combine several small
//free blocks into one big free block.
//The combine unit is a virtual area,so,a problem may exists:if two virtual
//areas,one's end address is the same as the other's start address,so in normal
//case,these two virtual area should be combined into one big block.But in 
//current implementation,this function is implemented by Hello China,in fact,
//this function have very seldom influence the efficiency.
//This routine does the following actions:
// 1. From the first block,check if there are at least two blocks free and
//    consecutive;
// 2. If so,combine the two blocks into one block,and remove one from free
//    list;
// 3. Until reach the end position of the virtual area.
//
static VOID CombineBlock(__VIRTUAL_AREA_NODE* lpVirtualArea,__HEAP_OBJECT* lpHeapObj)
{
	__FREE_BLOCK_HEADER*           lpFirstBlock     = NULL;
	__FREE_BLOCK_HEADER*           lpSecondBlock    = NULL;
	LPVOID                         lpEndAddr        = NULL;

	if((NULL == lpVirtualArea) || (NULL == lpHeapObj)) //Invalid parameters.
		return;

	lpEndAddr     = (LPVOID)((DWORD)lpVirtualArea->lpStartAddress
		+ lpVirtualArea->dwAreaSize);

	lpFirstBlock  = (__FREE_BLOCK_HEADER*)lpVirtualArea->lpStartAddress;
	lpSecondBlock = (__FREE_BLOCK_HEADER*)((DWORD)lpFirstBlock
		+ sizeof(__FREE_BLOCK_HEADER)
		+ lpFirstBlock->dwBlockSize);  //Now,lpSecondBlock pointing to the second block.

	while(TRUE)
	{
		if(lpEndAddr == (LPVOID)lpSecondBlock) //Reach the end of the virtual area.
			break;
		if((lpFirstBlock->dwFlags & BLOCK_FLAGS_FREE) &&
		   (lpSecondBlock->dwFlags & BLOCK_FLAGS_FREE))  //Two blocks all free,combine it.
		{
			lpFirstBlock->dwBlockSize += lpSecondBlock->dwBlockSize;
			lpFirstBlock->dwBlockSize += sizeof(__FREE_BLOCK_HEADER);
			//
			//Delete the second block from free list.
			//
			lpSecondBlock->lpNext->lpPrev = lpSecondBlock->lpPrev;
			lpSecondBlock->lpPrev->lpNext = lpSecondBlock->lpNext;

			lpSecondBlock = (__FREE_BLOCK_HEADER*)((DWORD)lpFirstBlock
				+ sizeof(__FREE_BLOCK_HEADER)
				+ lpFirstBlock->dwBlockSize);  //Update the second block.
			continue;   //Continue to next round.
		}
		if((lpFirstBlock->dwFlags & BLOCK_FLAGS_USED) ||
		   (lpSecondBlock->dwFlags & BLOCK_FLAGS_USED)) //Any block is used.
		{
			lpFirstBlock  = lpSecondBlock;
			lpSecondBlock = (__FREE_BLOCK_HEADER*)((DWORD)lpFirstBlock
				+ sizeof(__FREE_BLOCK_HEADER)
				+ lpFirstBlock->dwBlockSize);
			continue;
		}	
	}
}

//
//The implementation of HeapFree routine.
//This routine does the following:
// 1. Insert the memory block freed by user into heap's free list;
// 2. Find which virtual area this address belong to;
// 3. Combine the virtual area by calling CombineBlock routine;
// 4. Check if the virtual area to be combined is ONE free block,
//    If so,then release the virtual area and virtual area node
//    object.
//
static VOID HeapFree(LPVOID lpStartAddr,__HEAP_OBJECT* lpHeapObj)
{
	__FREE_BLOCK_HEADER*    lpFreeHeader  = NULL;
	__VIRTUAL_AREA_NODE*    lpVirtualArea = NULL;
	__VIRTUAL_AREA_NODE*    lpVirtualTmp  = NULL;

	if((NULL == lpStartAddr) || (NULL == lpHeapObj)) //Invalid parameter.
		return;

	lpFreeHeader = (__FREE_BLOCK_HEADER*)((DWORD)lpStartAddr
		- sizeof(__FREE_BLOCK_HEADER));  //Get the block's header.
	if(!(lpFreeHeader->dwFlags & BLOCK_FLAGS_USED)) //Abnormal case.
		return;

	//
	//Now,check the block to be freed belong to which virtual area.
	//
	lpVirtualArea = lpHeapObj->lpVirtualArea;
	while(lpVirtualArea)
	{
		if(((DWORD)lpStartAddr > (DWORD)lpVirtualArea->lpStartAddress) &&
		   ((DWORD)lpStartAddr < (DWORD)lpVirtualArea->lpStartAddress
		   + lpVirtualArea->dwAreaSize))  //Belong to this virtual area.
		{
			break;
		}
		lpVirtualArea = lpVirtualArea->lpNext;
	}
	if(NULL == lpVirtualArea)  //Can not find a virtual area that countains
		                       //the free block to be released.
	{
		//printf("\r\nFree a invalid block: can not find virtual area.");
	    return;
	}

	//
	//Now,should insert the free block into heap object's free list.
	//
	lpFreeHeader->dwFlags |= BLOCK_FLAGS_FREE;
	lpFreeHeader->dwFlags &= ~BLOCK_FLAGS_USED;  //Clear the used flags.
	lpFreeHeader->lpPrev   = &lpHeapObj->FreeBlockHeader;
	lpFreeHeader->lpNext   = lpHeapObj->FreeBlockHeader.lpNext;
	lpFreeHeader->lpPrev->lpNext = lpFreeHeader;
	lpFreeHeader->lpNext->lpPrev = lpFreeHeader;

	CombineBlock(lpVirtualArea,lpHeapObj);      //Combine this virtual area.
	//
	//Now,should check if the whole virtual area is a free block.
	//If so,delete the free block from free list,then release the 
	//virtual area to system.
	//
	lpFreeHeader = (__FREE_BLOCK_HEADER*)(lpVirtualArea->lpStartAddress);
	if((lpFreeHeader->dwFlags & BLOCK_FLAGS_FREE) &&
	   (lpFreeHeader->dwBlockSize + sizeof(__FREE_BLOCK_HEADER)
	   == lpVirtualArea->dwAreaSize))
	{
		//
		//Delete the free block from free list.
		//
		lpFreeHeader->lpPrev->lpNext = lpFreeHeader->lpNext;
		lpFreeHeader->lpNext->lpPrev = lpFreeHeader->lpPrev;
		//
		//Now,should delete the virtual area node object from
		//heap object's virtual list.
		//
		lpVirtualTmp = lpHeapObj->lpVirtualArea;
		if(lpVirtualTmp == lpVirtualArea)  //The first virtual node.
		{
			lpHeapObj->lpVirtualArea = lpVirtualArea->lpNext;
		}
		else    //Not the first one.
		{
			while(lpVirtualTmp->lpNext != lpVirtualArea)
			{
				lpVirtualTmp = lpVirtualTmp->lpNext;
			}
			lpVirtualTmp->lpNext = lpVirtualArea->lpNext;  //Delete it.
		}
		//
		//Then,should release the virtual area and virtual area node 
		//object.
		//
		RELEASE_VIRTUAL_AREA((LPVOID)lpVirtualArea->lpStartAddress);
		RELEASE_KERNEL_MEMORY((LPVOID)lpVirtualArea);
	}

	return;
}

/*************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
*************************************************************************/
//
//The declaration of HeapManager object.
//There is only one HeapManager object in whole system.
//

__HEAP_MANAGER HeapManager = {
	CreateHeap,                   //CreateHeap routine.
	DestroyHeap,                  //DestroyHeap routine.
	DestroyAllHeap,               //DestroyAllHeap routine.
	HeapAlloc,                    //HeapAlloc routine.
	HeapFree                      //HeapFree routine.
};

//
//The following are malloc routine's implementation.
//This routine create a default heap,if not exists yet,then allocate
//memory from this default heap.
//
LPVOID malloc(DWORD dwSize)
{
	DWORD            dwFlags    = NULL;
	LPVOID           lpResult   = NULL;
	__HEAP_OBJECT*   lpHeapObj  = NULL;
	DWORD            dwHeapSize = 0L;

	if(0 == dwSize)  //Invalid parameter.
		return lpResult;

	if(NULL == CURRENT_KERNEL_THREAD->lpDefaultHeap)  //Should create one.
	{
		dwHeapSize = (dwSize + sizeof(__FREE_BLOCK_HEADER) > DEFAULT_VIRTUAL_AREA_SIZE) ?
			(dwSize + sizeof(__FREE_BLOCK_HEADER)) : DEFAULT_VIRTUAL_AREA_SIZE;
		lpHeapObj = CreateHeap(dwHeapSize);
		if(NULL == lpHeapObj)  //Can not create heap object.
			return lpResult;
		__ENTER_CRITICAL_SECTION(NULL,dwFlags);
		CURRENT_KERNEL_THREAD->lpDefaultHeap = (LPVOID)lpHeapObj;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	}
	else
	{
		lpHeapObj = (__HEAP_OBJECT*)CURRENT_KERNEL_THREAD->lpDefaultHeap;
	}
	return HeapAlloc(lpHeapObj,dwSize);
}

//
//The implementation of free routine.
//This routine frees a memory block,to the default heap object of
//current kernel thread.
//
VOID free(LPVOID lpMemory)
{
	__HEAP_OBJECT*      lpHeapObj = NULL;
	
	if(NULL == lpMemory)
		return;

	lpHeapObj = (__HEAP_OBJECT*)CURRENT_KERNEL_THREAD->lpDefaultHeap;
	if(NULL == lpHeapObj)    //Invalid case.
		return;
	HeapFree(lpMemory,lpHeapObj);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
视频一区欧美日韩| 日韩欧美国产综合在线一区二区三区| 色屁屁一区二区| 日韩视频一区二区| 亚洲男人都懂的| 国产久卡久卡久卡久卡视频精品| 色狠狠一区二区| 国产午夜精品福利| 久久不见久久见免费视频7| 色综合av在线| 一区免费观看视频| 国产黄色精品网站| 亚洲精品一区二区三区蜜桃下载 | 一区二区视频在线看| 国产盗摄一区二区三区| 欧美一区二区女人| 亚洲精品成a人| 99久久国产免费看| 国产精品入口麻豆九色| 国产成人激情av| 日韩亚洲欧美综合| 午夜电影网亚洲视频| 欧美综合亚洲图片综合区| 中文字幕不卡在线观看| 国产在线精品一区在线观看麻豆| 在线不卡免费欧美| 视频在线在亚洲| 欧美精品亚洲一区二区在线播放| 亚洲成人av电影在线| 欧美在线观看你懂的| 亚洲在线一区二区三区| 91久久人澡人人添人人爽欧美 | 亚洲一区成人在线| 在线看国产一区| 亚洲综合丁香婷婷六月香| 在线视频国产一区| 五月天精品一区二区三区| 91麻豆精品国产自产在线观看一区| 亚洲一区在线观看免费 | 色偷偷成人一区二区三区91| 亚洲精品免费在线播放| 色哟哟精品一区| 亚洲成a人v欧美综合天堂下载| 91精品国产高清一区二区三区蜜臀| 午夜精品久久一牛影视| 日韩欧美一级二级| 国产一区二区在线视频| 国产精品嫩草久久久久| 91黄色激情网站| 男女激情视频一区| 中文字幕va一区二区三区| 99久久777色| 亚洲一区二区av在线| 欧美一级一级性生活免费录像| 久久av资源网| 国产精品久久久久精k8 | 秋霞影院一区二区| 久久综合色鬼综合色| 成人教育av在线| 亚洲国产日产av| 久久久久久一级片| 成人av在线播放网址| 视频一区欧美精品| 国产精品天干天干在线综合| 欧美日韩美女一区二区| 国产一区二区美女| 亚洲网友自拍偷拍| 久久午夜电影网| 欧美三级蜜桃2在线观看| 国内精品久久久久影院薰衣草| 国产精品久久久久久久久免费桃花 | 天天影视网天天综合色在线播放| 精品欧美黑人一区二区三区| 久久久99免费| 91在线观看高清| 国产精品欧美久久久久一区二区| 91免费看`日韩一区二区| 免费观看在线综合| 综合电影一区二区三区 | 日韩精品1区2区3区| 欧美精品一区二| 欧美性生活一区| 国产黄色精品网站| 天堂资源在线中文精品| 国产精品久久久久久亚洲伦| 日韩一区二区免费视频| 欧美日韩国产在线播放网站| 成人在线视频首页| 国产精品亚洲一区二区三区在线| 亚洲高清免费观看| 亚洲特黄一级片| 日本一区二区三区四区在线视频| 欧美一区永久视频免费观看| 色八戒一区二区三区| 成人激情小说网站| 国内外成人在线| 日韩av一区二区在线影视| 一个色在线综合| 中文字幕一区二区三区四区不卡| 精品少妇一区二区三区在线播放 | 精品一区二区日韩| 婷婷久久综合九色综合绿巨人| 国产精品成人一区二区艾草| 久久精品视频一区二区| 日韩精品中文字幕在线不卡尤物 | 欧美日韩一区高清| 在线欧美小视频| 色综合天天综合网天天狠天天| 国产激情一区二区三区| 国产高清不卡一区二区| 国产福利不卡视频| 国产精品综合视频| 国产成人一区二区精品非洲| 国产精品亚洲专一区二区三区| 国产福利一区二区三区视频在线| 国内精品在线播放| 国产精品18久久久久久久久| 国产美女av一区二区三区| 国产麻豆视频精品| 国产99精品视频| 91在线免费看| 欧美日韩中文字幕精品| 在线影院国内精品| 欧美日韩精品一区二区天天拍小说 | 成人激情免费视频| 成人91在线观看| 色综合久久综合网欧美综合网| 在线看一区二区| 91精品国产一区二区三区| 欧美一区二区女人| 久久精品一区二区三区不卡牛牛| 国产亚洲1区2区3区| 一色桃子久久精品亚洲| 亚洲尤物在线视频观看| 天天综合色天天综合色h| 久久99国产精品尤物| 成人综合婷婷国产精品久久免费| 91网站最新网址| 日韩午夜激情电影| 中文字幕欧美国产| 性欧美大战久久久久久久久| 国产一区二区h| 91国产福利在线| 欧美电视剧免费观看| 日韩美女视频19| 男男视频亚洲欧美| 99久久精品一区| 欧美一区二区三区在线观看视频| 久久久噜噜噜久久人人看 | 一区二区在线看| 韩日精品视频一区| 91福利区一区二区三区| 久久亚洲一区二区三区四区| 亚洲另类在线视频| 国产一区二区三区精品欧美日韩一区二区三区 | 中文字幕一区二区三区色视频 | 丁香六月综合激情| 制服丝袜亚洲色图| 国产精品毛片高清在线完整版| 午夜视频在线观看一区二区| 国产精品18久久久久久久网站| 欧美三级中文字幕| 国产欧美综合在线观看第十页| 午夜精品福利在线| 97精品视频在线观看自产线路二| 91精品国产91久久久久久一区二区| 自拍偷自拍亚洲精品播放| 美国毛片一区二区| 91成人在线免费观看| 欧美极品xxx| 久久成人麻豆午夜电影| 精品视频一区 二区 三区| 国产精品久久久久桃色tv| 激情成人综合网| 日韩视频一区二区三区在线播放 | 亚洲精品日日夜夜| 成人性视频免费网站| 欧美精品一区男女天堂| 视频一区国产视频| 欧美撒尿777hd撒尿| 亚洲免费在线看| 9i在线看片成人免费| 久久久久久97三级| 国产一区二区三区四区在线观看| 91精品国产综合久久精品app| 亚洲综合999| 欧美体内she精视频| 亚洲精品网站在线观看| av成人免费在线观看| 欧美激情一区二区三区蜜桃视频| 国内久久精品视频| 久久亚洲一区二区三区明星换脸 | 国产嫩草影院久久久久| 国产自产2019最新不卡| wwwwxxxxx欧美| 国产成人无遮挡在线视频| 欧美国产1区2区| 成人午夜电影小说| 国产精品白丝在线| 91免费在线播放|