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

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

?? ktmgr2.cpp

?? 小型的操作系統開發的原代碼
?? CPP
字號:
//***********************************************************************/
//    Author                    : Garry
//    Original Date             : Oct,15 2006
//    Module Name               : KTMGR2.CPP
//    Module Funciton           : 
//                                This module countains kernel thread and kernel thread 
//                                manager's implementation code.
//                                This file is the second part of KTMGR.CPP,in order
//                                to reduce one file's size.
//                                The global routines in this file can only be refered
//                                by KTMGR.CPP file.
//
//                                ************
//                                This file is the most important file of Hello China.
//                                ************
//    Last modified Author      : Garry
//    Last modified Date        : Sep,30,2006
//    Last modified Content     :
//                                1. 
//                                2.
//    Lines number              :
//***********************************************************************/

#ifndef __STDAFX_H__
#include "..\INCLUDE\StdAfx.h"
#endif

#include "..\INCLUDE\ARCHSTD.H"

//
//This routine tris to get a schedulable kernel thread from ready queue,
//the target kernel thread's priority must larger or equal dwPriority.
//If can not find,returns NULL.
//
__KERNEL_THREAD_OBJECT* GetScheduleKernelThread(__COMMON_OBJECT* lpThis,
												DWORD dwPriority)
{
	if((NULL == lpThis) || (dwPriority > MAX_KERNEL_THREAD_PRIORITY)) //Invalid parameters.
	{
		return NULL;
	}
	__KERNEL_THREAD_OBJECT*   lpKernel = NULL;
	__KERNEL_THREAD_MANAGER*  lpMgr    = (__KERNEL_THREAD_MANAGER*)lpThis;
	__PRIORITY_QUEUE*         lpQueue  = NULL;
	
	//Search a kernel thread from ready queue.
	for(DWORD i = dwPriority;i < MAX_KERNEL_THREAD_PRIORITY + 1;i ++)
	{
		lpQueue  = lpMgr->ReadyQueue[MAX_KERNEL_THREAD_PRIORITY - i + dwPriority];
		lpKernel = (__KERNEL_THREAD_OBJECT*)lpQueue->GetHeaderElement(
			(__COMMON_OBJECT*)lpQueue,
			NULL);
		if(lpKernel)  //Found one successfully.
		{
			return lpKernel;
		}
	}
	return lpKernel;  //If reach here,it means fail.
}

//
//Add a kernel thread whose status is READY to ready queue.
//The kernel thread's priority acts as index to locate the queue element
//in ready queue array.
//
VOID AddReadyKernelThread(__COMMON_OBJECT* lpThis,
						  __KERNEL_THREAD_OBJECT* lpKernelThread)
{
	if((NULL == lpThis) || (NULL == lpKernelThread)) //Invalid parameters.
	{
		BUG();
		return;
	}

	if((lpKernelThread->dwThreadPriority > MAX_KERNEL_THREAD_PRIORITY) ||
	   (lpKernelThread->dwThreadStatus != KERNEL_THREAD_STATUS_READY))
	{
		BUG();
		return;
	}

	__PRIORITY_QUEUE* lpQueue = ((__KERNEL_THREAD_MANAGER*)lpThis)->ReadyQueue[
		lpKernelThread->dwThreadPriority];

	lpQueue->InsertIntoQueue((__COMMON_OBJECT*)lpQueue,
		(__COMMON_OBJECT*)lpKernelThread,
		0L);
	return;
}

//
//SetThreadHook routine,this routine sets appropriate hook routine
//according to dwHookType, and returns the old one.
//
__THREAD_HOOK_ROUTINE SetThreadHook(DWORD dwHookType,
									__THREAD_HOOK_ROUTINE lpRoutine)
{
	__THREAD_HOOK_ROUTINE lpOldRoutine = NULL;
	DWORD                 dwFlags;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	switch(dwHookType)
	{
	case THREAD_HOOK_TYPE_CREATE:
		lpOldRoutine = KernelThreadManager.lpCreateHook;
		KernelThreadManager.lpCreateHook = lpRoutine;
		break;
	case THREAD_HOOK_TYPE_ENDSCHEDULE:
		lpOldRoutine = KernelThreadManager.lpEndScheduleHook;
		KernelThreadManager.lpEndScheduleHook = lpRoutine;
		break;
	case THREAD_HOOK_TYPE_BEGINSCHEDULE:
		lpOldRoutine = KernelThreadManager.lpBeginScheduleHook;
		KernelThreadManager.lpBeginScheduleHook = lpRoutine;
		break;
	case THREAD_HOOK_TYPE_TERMINAL:
		lpOldRoutine = KernelThreadManager.lpTerminalHook;
		KernelThreadManager.lpTerminalHook = lpRoutine;
		break;
	default:  //Should not reach here.
		BUG();
		break;
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return lpOldRoutine;
}

//
//CallThreadHook,this routine calls proper hook routine according
//to the dwHookType value.
//
VOID CallThreadHook(DWORD dwHookType,
					__KERNEL_THREAD_OBJECT* lpPrev,
					__KERNEL_THREAD_OBJECT* lpNext)
{
	if(dwHookType & THREAD_HOOK_TYPE_CREATE)  //Should call create hook.
	{
		if(NULL == lpPrev)
		{
			BUG(); //Should not occur.
			return;
		}
		if(NULL == KernelThreadManager.lpCreateHook)  //Not set yet.
		{
			return;
		}
		//Call the create hook routine.
		KernelThreadManager.lpCreateHook(lpPrev,&lpPrev->dwUserData);
	}
	if(dwHookType & THREAD_HOOK_TYPE_ENDSCHEDULE) //Should call end hook.
	{
		if(NULL == lpPrev)
		{
			BUG();
			return;
		}
		if(NULL == KernelThreadManager.lpEndScheduleHook)
		{
			return;
		}
		//Call end schedule hook now.
		KernelThreadManager.lpEndScheduleHook(lpPrev,&lpPrev->dwUserData);
	}
	if(dwHookType & THREAD_HOOK_TYPE_BEGINSCHEDULE) //Should call begin hook.
	{
		if(NULL == lpNext)
		{
			BUG();
			return;
		}
		if(NULL == KernelThreadManager.lpBeginScheduleHook)
		{
			return;
		}
		//Call begin schedule hook now.
		KernelThreadManager.lpBeginScheduleHook(lpNext,&lpNext->dwUserData);
	}
	if(dwHookType & THREAD_HOOK_TYPE_TERMINAL) //Should cal terminal hook.
	{
		if(NULL == lpPrev)
		{
			BUG();
			return;
		}
		if(NULL == KernelThreadManager.lpTerminalHook)
		{
			return;
		}
		//Call terminal hook now.
		KernelThreadManager.lpTerminalHook(lpPrev,&lpPrev->dwUserData);
	}
}

//
//KernelThreadWrapper routine.
//The routine is all kernel thread's entry porint.
//The routine does the following:
// 1. Calles the kernel thread's start routine;
// 2. When the start routine is over,put the kernel thread object into terminal queue;
// 3. Wakeup all kernel thread(s) waiting for this kernel thread object.
// 4. Reschedule all kernel thread(s).
//This routine will never return.
//
VOID KernelThreadWrapper(__COMMON_OBJECT* lpKThread)
{
	__KERNEL_THREAD_OBJECT*        lpKernelThread      = NULL;
	__KERNEL_THREAD_OBJECT*        lpWaitingThread     = NULL;
	__PRIORITY_QUEUE*              lpWaitingQueue      = NULL;
	DWORD                          dwRetValue          = 0L;
	DWORD                          dwFlags             = 0L;

	if(NULL == lpKThread)                                //Parameter check.
		goto __TERMINAL;

	lpKernelThread = (__KERNEL_THREAD_OBJECT*)lpKThread;

	if(NULL == lpKernelThread->KernelThreadRoutine)      //If the main routine is empty.
		goto __TERMINAL;

	dwRetValue = lpKernelThread->KernelThreadRoutine(lpKernelThread->lpRoutineParam);

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpKernelThread->dwReturnValue    = dwRetValue;      //Set the return value of this thread.
	lpKernelThread->dwThreadStatus   = KERNEL_THREAD_STATUS_TERMINAL;  //Change the status.

	//
	//The following code wakeup all kernel thread(s) who waiting for this kernel thread 
	//object.
	//
	lpWaitingQueue  = lpKernelThread->lpWaitingQueue;
	lpWaitingThread = (__KERNEL_THREAD_OBJECT*)lpWaitingQueue->GetHeaderElement(
		(__COMMON_OBJECT*)lpWaitingQueue,
		NULL);
	while(lpWaitingThread)
	{
		lpWaitingThread->dwThreadStatus = KERNEL_THREAD_STATUS_READY;
		KernelThreadManager.AddReadyKernelThread(
			(__COMMON_OBJECT*)&KernelThreadManager,
			lpWaitingThread);  //Add to ready queue.
		lpWaitingThread = (__KERNEL_THREAD_OBJECT*)lpWaitingQueue->GetHeaderElement(
			(__COMMON_OBJECT*)lpWaitingQueue,
			NULL);
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

__TERMINAL:
	KernelThreadManager.lpTerminalQueue->InsertIntoQueue((__COMMON_OBJECT*)KernelThreadManager.lpTerminalQueue,
		(__COMMON_OBJECT*)lpKernelThread,
		0L);    //Insert the current kernel thread object into TERMINAL queue.

	KernelThreadManager.ScheduleFromProc(NULL);  //Re-schedule kernel thread.

	return;        //***** CAUTION! ***** : This instruction will never reach.
}

//
//The implementation of WaitForKernelThreadObject,because this routine calls ScheduleFromproc,
//so we implement it here(After the implementation of ScheduleFromProc).
//The routine does the following:
// 1. Check the current status of the kernel thread object;
// 2. If the current status is not KERNEL_THREAD_STATUS_TERMINAL,then block the
//    current kernel thread(who want to wait),put it into the object's waiting queue;
// 3. Call ScheduleFromProc to fetch next kernel thread whose status is READY to run.
//
DWORD WaitForKernelThreadObject(__COMMON_OBJECT* lpThis)
{
	__KERNEL_THREAD_OBJECT*           lpKernelThread = NULL;
	__KERNEL_THREAD_OBJECT*           lpCurrent      = NULL;
	__PRIORITY_QUEUE*                 lpWaitingQueue = NULL;
	DWORD                             dwFlags        = 0L;
	
	if(NULL == lpThis)    //Parameter check.
		return 1L;

	lpKernelThread = (__KERNEL_THREAD_OBJECT*)lpThis;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	if(KERNEL_THREAD_STATUS_TERMINAL == lpKernelThread->dwThreadStatus)  //If the object's
		                                                                 //status is TERMINAL,
																		 //the wait operation
																		 //will secussfully.
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return OBJECT_WAIT_RESOURCE;
	}

	//
	//If the waited object's status is not TERMINAL,then the waiting operation will
	//not secussful,the current kernel thread who want to wait will be blocked.
	//

	lpWaitingQueue = lpKernelThread->lpWaitingQueue;
	lpCurrent = KernelThreadManager.lpCurrentKernelThread;
	lpCurrent->dwThreadStatus = KERNEL_THREAD_STATUS_BLOCKED;

	lpWaitingQueue->InsertIntoQueue((__COMMON_OBJECT*)lpWaitingQueue,
		(__COMMON_OBJECT*)lpCurrent,
		0L);    //Insert into the current kernel thread into waiting queue.
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

	KernelThreadManager.ScheduleFromProc(NULL);

	return 0L;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡免费追剧大全电视剧网站| 69p69国产精品| 亚洲在线免费播放| 日本一区二区久久| 精品剧情v国产在线观看在线| 在线亚洲精品福利网址导航| 成人网页在线观看| 成人一级片在线观看| 91 com成人网| 亚洲丝袜美腿综合| 亚洲天天做日日做天天谢日日欢| 麻豆国产欧美一区二区三区| 欧美aaaaa成人免费观看视频| 午夜精品aaa| 五月天国产精品| 99精品国产一区二区三区不卡| 成人妖精视频yjsp地址| 精品国产乱码91久久久久久网站| 日韩精品最新网址| 久久精品男人的天堂| 国产丝袜在线精品| 久久成人精品无人区| 国产成人一区在线| 99国产精品国产精品久久| 久久久噜噜噜久久中文字幕色伊伊 | 日本欧美一区二区三区| 五月婷婷久久综合| 欧美综合久久久| 日韩伦理电影网| 99精品欧美一区二区三区小说| 亚洲国产精品二十页| 国产一区二区伦理片| 国产91露脸合集magnet| 色天使久久综合网天天| 欧美三级乱人伦电影| 欧美一区二区三区日韩视频| 亚洲精品一区二区三区香蕉| 美女精品自拍一二三四| 69成人精品免费视频| 丝袜美腿一区二区三区| 国产精品99久久久久久有的能看| 色综合天天综合色综合av| 欧美精品v日韩精品v韩国精品v| 精品福利一区二区三区免费视频| 免费在线观看精品| xf在线a精品一区二区视频网站| 一区二区在线观看不卡| 国内一区二区在线| 欧美体内she精高潮| 久久中文字幕电影| 国产精品91一区二区| 国产精品久久久一本精品| 免费的成人av| 欧美电视剧在线观看完整版| 国内国产精品久久| 国产区在线观看成人精品| 日韩中文字幕av电影| 欧美一区二区精品| 国产传媒一区在线| 亚洲色图在线看| 91超碰这里只有精品国产| 久久精品国产久精国产| 国产欧美精品日韩区二区麻豆天美| 成人深夜福利app| 亚洲男人的天堂在线观看| 国产传媒一区在线| 一区二区三区在线播| 成人激情动漫在线观看| 一区二区三区四区亚洲| 日韩欧美国产一区二区三区 | 日韩欧美成人一区二区| 国产成人精品一区二区三区四区| 国产精品理论在线观看| 在线成人午夜影院| 国产99久久精品| 亚洲制服欧美中文字幕中文字幕| 欧美成人性战久久| 色婷婷久久久综合中文字幕| 人妖欧美一区二区| 亚洲狼人国产精品| 精品久久久三级丝袜| 欧美日韩视频在线观看一区二区三区| 狠狠色伊人亚洲综合成人| 一区二区三区色| 久久精品夜夜夜夜久久| 欧美日韩午夜在线| www.成人在线| 日韩码欧中文字| 欧美一区中文字幕| 日本韩国欧美一区| 亚洲福利电影网| 日韩免费电影网站| 色噜噜狠狠成人网p站| 韩国毛片一区二区三区| 日韩高清一级片| 亚洲免费av高清| 久久精品亚洲乱码伦伦中文 | 亚洲国产另类av| 国产精品精品国产色婷婷| 日韩视频在线一区二区| 国产福利视频一区二区三区| 天堂成人免费av电影一区| 亚洲色大成网站www久久九九| 精品日韩在线一区| 在线综合视频播放| 欧美日韩国产一区二区三区地区| 日日夜夜精品视频免费 | www精品美女久久久tv| 欧美理论在线播放| 在线免费观看日本一区| 97se亚洲国产综合自在线观| 国产成人一区二区精品非洲| 久久精品国产77777蜜臀| 亚洲成人免费观看| 2023国产精品| 日韩精品一区二区三区在线播放| 欧美午夜精品理论片a级按摩| 一本久道久久综合中文字幕| 成人中文字幕合集| 不卡视频在线观看| a亚洲天堂av| 白白色 亚洲乱淫| av资源网一区| 91农村精品一区二区在线| 日本中文字幕一区二区视频 | 久久精品国产久精国产| 经典一区二区三区| 亚洲一区在线电影| 午夜激情综合网| 天堂在线亚洲视频| 美女精品自拍一二三四| 国产高清精品在线| 成人免费va视频| 色哟哟一区二区在线观看| 91精品福利视频| 91麻豆精品国产91久久久资源速度| 欧美人妖巨大在线| 久久综合久久久久88| 国产亚洲美州欧州综合国| 国产精品嫩草99a| 久久尤物电影视频在线观看| 国产女主播视频一区二区| 成人欧美一区二区三区黑人麻豆 | 天堂午夜影视日韩欧美一区二区| 日日夜夜一区二区| 激情另类小说区图片区视频区| 成人福利电影精品一区二区在线观看 | 视频一区欧美日韩| 国产一区91精品张津瑜| av不卡一区二区三区| 欧美日韩国产综合一区二区| 日韩欧美三级在线| 中文字幕一区二区三区不卡在线| 亚洲一区二区三区视频在线播放| 日韩精品久久久久久| 成人激情免费视频| 欧美一区二区福利视频| 中文字幕av一区二区三区高| 亚洲伊人伊色伊影伊综合网| 国产一区啦啦啦在线观看| 色综合天天综合网国产成人综合天 | 91精品国产色综合久久ai换脸 | 亚洲精品国产高清久久伦理二区| 男女性色大片免费观看一区二区 | 国内精品视频666| 色又黄又爽网站www久久| 亚洲精品在线观看视频| 夜夜精品浪潮av一区二区三区| 久久91精品久久久久久秒播| 一本在线高清不卡dvd| 日韩久久免费av| 亚洲综合区在线| 国产成人免费在线| 欧美人狂配大交3d怪物一区| **欧美大码日韩| 国产一区二区美女| 日韩美女在线视频| 午夜久久久影院| 99国产精品久久久久| 久久精品视频一区二区| 免费观看一级特黄欧美大片| 在线看一区二区| 国产精品传媒入口麻豆| 色综合久久精品| 国产精品色哟哟| 国产一区二区在线影院| 日韩午夜在线观看视频| 亚洲成人av一区| 一本大道综合伊人精品热热| 日本一区二区三区高清不卡| 毛片基地黄久久久久久天堂| 欧美亚洲自拍偷拍| 亚洲人成网站精品片在线观看| 精品一区二区三区在线观看| 91精品啪在线观看国产60岁| 亚洲超碰97人人做人人爱| 91福利精品第一导航| 亚洲日韩欧美一区二区在线| 国产91在线看| 国产午夜精品久久久久久免费视|