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

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

?? synobj.cpp

?? 小型的操作系統開發的原代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:

static DWORD WaitForEventObject(__COMMON_OBJECT* lpThis)
{
	__EVENT*                      lpEvent             = NULL;
	__KERNEL_THREAD_OBJECT*       lpKernelThread      = NULL;
	__KERNEL_THREAD_CONTEXT*      lpContext           = NULL;
	DWORD                         dwFlags             = 0L;

	if(NULL == lpThis)
		return OBJECT_WAIT_FAILED;

	lpEvent = (__EVENT*)lpThis;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	if(EVENT_STATUS_FREE == lpEvent->dwEventStatus)
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return OBJECT_WAIT_RESOURCE;
	}
	else
	{
		lpKernelThread = KernelThreadManager.lpCurrentKernelThread;
		lpKernelThread->dwThreadStatus = KERNEL_THREAD_STATUS_BLOCKED;
		lpEvent->lpWaitingQueue->InsertIntoQueue(
			(__COMMON_OBJECT*)lpEvent->lpWaitingQueue,
			(__COMMON_OBJECT*)lpKernelThread,
			0L);
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);    //Leave critical section here is safety.
		//lpContext = &lpKernelThread->KernelThreadContext;
		KernelThreadManager.ScheduleFromProc(NULL);
	}
	return OBJECT_WAIT_RESOURCE;
}

//
//WaitForEventObjectEx's implementation.
//
static DWORD WaitForEventObjectEx(__COMMON_OBJECT* lpObject,DWORD dwMillionSecond)
{
	__EVENT*                      lpEvent         = (__EVENT*)lpObject;
	__KERNEL_THREAD_OBJECT*       lpKernelThread  = NULL;
	DWORD                         dwFlags;
	DWORD                         dwTimeOutTick;
	DWORD                         dwTimeSpan;

	if(NULL == lpObject)
	{
		BUG();
		return OBJECT_WAIT_FAILED;
	}

	dwTimeOutTick = (dwMillionSecond / SYSTEM_TIME_SLICE) ? 
		(dwMillionSecond / SYSTEM_TIME_SLICE) : 1;
	dwTimeOutTick += System.dwClockTickCounter;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);  //Acquire event object's spinlock.
	if(EVENT_STATUS_FREE == lpEvent->dwEventStatus)
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return OBJECT_WAIT_RESOURCE;
	}
	//Should waiting now.
	if(0 == dwMillionSecond)  //Waiting zero time.
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		KernelThreadManager.ScheduleFromProc(NULL);
		return OBJECT_WAIT_TIMEOUT;
	}
	lpKernelThread = KernelThreadManager.lpCurrentKernelThread;
	while(EVENT_STATUS_FREE != lpEvent->dwEventStatus)
	{
		if(dwTimeOutTick <= System.dwClockTickCounter)
		{
			__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
			return OBJECT_WAIT_TIMEOUT;
		}
		dwTimeSpan = (dwTimeOutTick - System.dwClockTickCounter) * SYSTEM_TIME_SLICE;
		lpKernelThread->dwThreadStatus = KERNEL_THREAD_STATUS_BLOCKED;
		//Add to event object's waiting queue.
		lpEvent->lpWaitingQueue->InsertIntoQueue(
			(__COMMON_OBJECT*)lpEvent->lpWaitingQueue,
			(__COMMON_OBJECT*)lpKernelThread,
			0L);
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		
		switch(TimeOutWaiting((__COMMON_OBJECT*)lpEvent,lpEvent->lpWaitingQueue,
			lpKernelThread,dwTimeSpan))
		{
			case OBJECT_WAIT_RESOURCE:  //Should loop to while again to check the status.
				__ENTER_CRITICAL_SECTION(NULL,dwFlags);
				break;
			case OBJECT_WAIT_TIMEOUT:
				return OBJECT_WAIT_TIMEOUT;
			case OBJECT_WAIT_DELETED:
				return OBJECT_WAIT_DELETED;
			default:
				BUG();
				return OBJECT_WAIT_FAILED;
		}
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return OBJECT_WAIT_RESOURCE;
}

////////////////////////////////////////////////////////////////////////////////////
//
// ------------------ ** The implementation of MUTEX object ** ---------------------
//
///////////////////////////////////////////////////////////////////////////////////

//
//The implementation of ReleaseMutex.
//

static DWORD ReleaseMutex(__COMMON_OBJECT* lpThis)
{
	__KERNEL_THREAD_OBJECT*     lpKernelThread   = NULL;
	__MUTEX*                    lpMutex          = NULL;
	DWORD                       dwPreviousStatus = 0L;
	DWORD                       dwFlags          = 0L;

	if(NULL == lpThis)    //Parameter check.
		return 0L;

	lpMutex = (__MUTEX*)lpThis;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	if(lpMutex->dwWaitingNum > 0)    //If there are other kernel threads waiting for this object.
		lpMutex->dwWaitingNum --;    //Decrement the counter.
	if(0 == lpMutex->dwWaitingNum)   //There is not kernel thread waiting for the object.
	{
		dwPreviousStatus = lpMutex->dwMutexStatus;
		lpMutex->dwMutexStatus = MUTEX_STATUS_FREE;  //Set to free.
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return 0L;
	}
	lpKernelThread = (__KERNEL_THREAD_OBJECT*)lpMutex->lpWaitingQueue->GetHeaderElement(
		(__COMMON_OBJECT*)lpMutex->lpWaitingQueue,
		0L);  //Get one waiting kernel thread to run.
	lpKernelThread->dwThreadStatus = KERNEL_THREAD_STATUS_READY;
	lpKernelThread->dwWaitingStatus &= ~OBJECT_WAIT_MASK;
	lpKernelThread->dwWaitingStatus |= OBJECT_WAIT_RESOURCE;
	KernelThreadManager.AddReadyKernelThread(
		(__COMMON_OBJECT*)&KernelThreadManager,
		lpKernelThread);  //Put the kernel thread to ready queue.
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

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

//
//The implementation of WaitForMutexObject.
//

static DWORD WaitForMutexObject(__COMMON_OBJECT* lpThis)
{
	__KERNEL_THREAD_OBJECT*        lpKernelThread   = NULL;
	__MUTEX*                       lpMutex          = NULL;
	DWORD                          dwFlags          = 0L;

	if(NULL == lpThis)    //Parameter check.
		return 0L;

	lpMutex = (__MUTEX*)lpThis;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	if(MUTEX_STATUS_FREE == lpMutex->dwMutexStatus)    //If the current mutex is free.
	{
		lpMutex->dwMutexStatus = MUTEX_STATUS_OCCUPIED;  //Modify the current status.
		lpMutex->dwWaitingNum  ++;    //Increment the counter.
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return OBJECT_WAIT_RESOURCE;  //The current kernel thread successfully occupy
		                              //the mutex.
	}
	else    //The status of the mutex is occupied.
	{
		lpKernelThread = KernelThreadManager.lpCurrentKernelThread;
		lpKernelThread->dwThreadStatus = KERNEL_THREAD_STATUS_BLOCKED;
		lpMutex->dwWaitingNum          ++;    //Increment the waiting number.

		lpMutex->lpWaitingQueue->InsertIntoQueue(
			(__COMMON_OBJECT*)lpMutex->lpWaitingQueue,
			(__COMMON_OBJECT*)lpKernelThread,
			0L);

		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);  //Leave critical section here is safety.
		//Reschedule all kernel thread(s).
		KernelThreadManager.ScheduleFromProc(NULL);
	}
	return OBJECT_WAIT_RESOURCE;
}

//
//Implementation of WaitForThisObjectEx routine.
//This routine is a time out waiting routine,caller can give a time value
//to indicate how long want to wait,once exceed the time value,waiting operation
//will return,even in case of the resource is not released.
//If the time value is zero,then this routine will check the current status of
//mutex object,if free,then occupy the object and return RESOURCE,else return
//TIMEOUT,and a re-schedule is triggered.
//
static DWORD WaitForMutexObjectEx(__COMMON_OBJECT* lpThis,DWORD dwMillionSecond)
{
	__MUTEX*                      lpMutex        = (__MUTEX*)lpThis;
	__KERNEL_THREAD_OBJECT*       lpKernelThread = NULL;
	DWORD                         dwFlags;

	if(NULL == lpMutex)
	{
		BUG();
		return OBJECT_WAIT_FAILED;
	}
	
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	if(MUTEX_STATUS_FREE == lpMutex->dwMutexStatus)  //Free now.
	{
		lpMutex->dwMutexStatus = MUTEX_STATUS_OCCUPIED;
		lpMutex->dwWaitingNum ++;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		//KernelThreadManager.ScheduleFromProc(NULL);  //Re-schedule here.
		return OBJECT_WAIT_RESOURCE;
	}
	else  //The mutex is not free now.
	{
		if(0 == dwMillionSecond)
		{
			__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
			KernelThreadManager.ScheduleFromProc(NULL); //Re-schedule here.
			return OBJECT_WAIT_TIMEOUT;
		}
		lpKernelThread = KernelThreadManager.lpCurrentKernelThread;
		//Waiting on mutex's waiting queue.
		lpKernelThread->dwThreadStatus = KERNEL_THREAD_STATUS_BLOCKED;
		lpMutex->lpWaitingQueue->InsertIntoQueue(
			(__COMMON_OBJECT*)lpMutex->lpWaitingQueue,
			(__COMMON_OBJECT*)lpKernelThread,
			0L);
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

		return TimeOutWaiting((__COMMON_OBJECT*)lpMutex,
			lpMutex->lpWaitingQueue,
			lpKernelThread,
			dwMillionSecond);
	}
}
//
//The implementation of MutexInitialize.
//

BOOL MutexInitialize(__COMMON_OBJECT* lpThis)
{
	__MUTEX*             lpMutex     = NULL;
	__PRIORITY_QUEUE*    lpQueue     = NULL;
	BOOL                 bResult     = FALSE;

	if(NULL == lpThis) //Parameter check.
		return bResult;

	lpQueue = (__PRIORITY_QUEUE*)ObjectManager.CreateObject(&ObjectManager,
		NULL,
		OBJECT_TYPE_PRIORITY_QUEUE);
	if(NULL == lpQueue)    //Failed to create priority queue.
		return bResult;

	if(!lpQueue->Initialize((__COMMON_OBJECT*)lpQueue))  //Initialize the queue object.
		goto __TERMINAL;

	lpMutex = (__MUTEX*)lpThis;
	lpMutex->dwMutexStatus     = MUTEX_STATUS_FREE;
	lpMutex->lpWaitingQueue    = lpQueue;
	lpMutex->WaitForThisObject = WaitForMutexObject;
	lpMutex->dwWaitingNum      = 0L;
	lpMutex->ReleaseMutex      = ReleaseMutex;
	lpMutex->WaitForThisObjectEx = WaitForMutexObjectEx;

	bResult = TRUE;    //Successful to initialize the mutex object.

__TERMINAL:
	if(!bResult)
	{
		if(NULL != lpQueue)    //Release the queue object.
			ObjectManager.DestroyObject(&ObjectManager,
			(__COMMON_OBJECT*)lpQueue);
	}
	return bResult;
}

//
//The implementation of MutexUninitialize.
//This object support safety deleted,so in this routine,all kernel thread(s)
//must be waken up before this object is destroyed.
//

VOID MutexUninitialize(__COMMON_OBJECT* lpThis)
{
	__PRIORITY_QUEUE*       lpWaitingQueue  = NULL;
	__KERNEL_THREAD_OBJECT* lpKernelThread  = NULL;
	DWORD                   dwFlags;

	if(NULL == lpThis) //parameter check.
	{
		BUG();
		return;
	}

	lpWaitingQueue = ((__MUTEX*)lpThis)->lpWaitingQueue;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpKernelThread = (__KERNEL_THREAD_OBJECT*)lpWaitingQueue->GetHeaderElement(
		(__COMMON_OBJECT*)lpWaitingQueue,
		NULL);
	while(lpKernelThread)
	{
		lpKernelThread->dwThreadStatus   = KERNEL_THREAD_STATUS_READY;
		lpKernelThread->dwWaitingStatus &= ~OBJECT_WAIT_MASK;
		lpKernelThread->dwWaitingStatus |= OBJECT_WAIT_DELETED;
		KernelThreadManager.AddReadyKernelThread(
			(__COMMON_OBJECT*)&KernelThreadManager,
			lpKernelThread);
		lpKernelThread = (__KERNEL_THREAD_OBJECT*)lpWaitingQueue->GetHeaderElement(
			(__COMMON_OBJECT*)lpWaitingQueue,
			NULL);
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

	ObjectManager.DestroyObject(&ObjectManager,
		(__COMMON_OBJECT*)lpWaitingQueue);
	return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩手机在线导航| 欧美精品在线一区二区| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲成人av一区二区三区| 一区二区三区中文在线| 中文字幕一区二区三区精华液| 国产亚洲精品bt天堂精选| 精品国精品自拍自在线| 久久免费的精品国产v∧| 久久精品在线免费观看| 欧美国产激情二区三区| 亚洲特黄一级片| 亚洲国产一区视频| 日本亚洲视频在线| 久久av资源站| 高清av一区二区| 91亚洲精品久久久蜜桃网站| 色婷婷久久99综合精品jk白丝| 成人黄色小视频| 欧美日韩一区国产| 欧美成人一区二区三区在线观看| 精品sm捆绑视频| 亚洲图片欧美激情| 午夜视频在线观看一区| 久草在线在线精品观看| 波多野结衣亚洲| 欧美日韩一区不卡| 国产欧美视频一区二区三区| 中文字幕在线不卡| 性久久久久久久久久久久| 激情久久五月天| 色视频成人在线观看免| 欧美成人a∨高清免费观看| 中文字幕的久久| 日韩中文字幕一区二区三区| 国产在线精品不卡| 色婷婷亚洲综合| 欧美一区二区三区婷婷月色| 亚洲国产电影在线观看| 亚洲韩国精品一区| 成人在线视频一区| 91精品一区二区三区久久久久久| 国产清纯白嫩初高生在线观看91| 亚洲aaa精品| 国产成人精品一区二区三区四区 | 91农村精品一区二区在线| 欧美日韩一区二区三区免费看| 欧美va亚洲va香蕉在线| 亚洲一区二区三区自拍| 国产精品99精品久久免费| 欧美午夜不卡在线观看免费| 国产亲近乱来精品视频| 轻轻草成人在线| 91浏览器入口在线观看| 精品电影一区二区三区| 亚洲成人在线网站| 97se狠狠狠综合亚洲狠狠| 日韩你懂的在线观看| 亚洲国产精品久久久男人的天堂| 成人免费av网站| 久久久久久久久久美女| 婷婷久久综合九色国产成人| 色婷婷狠狠综合| 国产精品久久夜| 国产成人免费在线观看不卡| 欧美一区二区国产| 亚洲高清久久久| 在线免费一区三区| 最新高清无码专区| 国产91高潮流白浆在线麻豆| 日韩欧美一二区| 日本成人在线网站| 在线电影院国产精品| 亚洲一区二区精品久久av| 91久久人澡人人添人人爽欧美| 亚洲欧洲精品天堂一级| 99久久久国产精品免费蜜臀| 亚洲欧洲成人av每日更新| 国产大片一区二区| 国产欧美一区二区精品忘忧草 | 久久久久久久综合狠狠综合| 精品一区二区三区在线观看| 日韩视频免费观看高清完整版 | 欧美揉bbbbb揉bbbbb| 国产精品二三区| 色就色 综合激情| 亚洲成人av在线电影| 制服丝袜一区二区三区| 开心九九激情九九欧美日韩精美视频电影| 欧美日韩精品一区二区三区四区 | 国产精品一区免费视频| 亚洲国产精品成人综合色在线婷婷 | 久久成人免费日本黄色| 欧美成人午夜电影| 国产精品一区在线观看乱码| 欧美精彩视频一区二区三区| 粉嫩久久99精品久久久久久夜| 中文字幕不卡一区| 一本一道久久a久久精品| 亚洲国产毛片aaaaa无费看| 欧美手机在线视频| 久久国产视频网| 欧美激情在线看| 一本一道久久a久久精品综合蜜臀| 亚洲一区二区三区四区中文字幕| 欧美精品v日韩精品v韩国精品v| 免费视频最近日韩| 国产精品色噜噜| 一本大道久久精品懂色aⅴ| 亚洲午夜在线观看视频在线| 日韩精品一区二区三区中文精品| 成人一区二区三区在线观看| 亚洲免费资源在线播放| 日韩精品中文字幕一区| 懂色av中文字幕一区二区三区| 一区二区三区精密机械公司| 日韩欧美国产1| 91在线精品秘密一区二区| 日本vs亚洲vs韩国一区三区二区 | 欧美另类久久久品| 国产乱人伦偷精品视频不卡| 亚洲精品日韩综合观看成人91| 日韩精品中午字幕| 91麻豆精品一区二区三区| 久久丁香综合五月国产三级网站| 国产精品美女久久久久aⅴ | 激情久久五月天| 一区二区三区在线视频免费| 精品国产青草久久久久福利| 日本电影欧美片| 国产iv一区二区三区| 免费一区二区视频| 亚洲国产日日夜夜| 亚洲天堂av一区| 久久久久国产一区二区三区四区| 欧美巨大另类极品videosbest | 国产精品丝袜在线| 日韩一区二区中文字幕| 99国产精品视频免费观看| 精品一区二区三区影院在线午夜 | 不卡一二三区首页| 精品无人区卡一卡二卡三乱码免费卡 | 免费观看日韩av| 一区二区免费在线播放| 国产精品国产三级国产aⅴ入口| 欧美一区二区观看视频| 欧美精品一卡两卡| 在线视频观看一区| 欧美三级乱人伦电影| 欧洲在线/亚洲| 色偷偷久久人人79超碰人人澡| 风流少妇一区二区| 国产精品一级黄| 国产精品亚洲成人| 狠狠色伊人亚洲综合成人| 蜜桃av一区二区在线观看| 蜜臀久久久久久久| 麻豆国产欧美日韩综合精品二区| 毛片一区二区三区| 日本网站在线观看一区二区三区 | 国产精品青草久久| 国产精品天天看| 亚洲天堂免费在线观看视频| 日韩伦理电影网| 亚洲另类色综合网站| 亚洲男人天堂一区| 亚洲成在线观看| 欧美a一区二区| 久草精品在线观看| 不卡一区二区在线| 日本韩国欧美在线| 欧美亚洲一区二区在线| 欧美久久久久久久久久| 欧美xingq一区二区| 久久久精品天堂| 亚洲色图另类专区| 日韩黄色小视频| 国产一区二区三区美女| 成人av在线资源网| 欧洲精品一区二区| 日韩丝袜情趣美女图片| 国产三区在线成人av| 最新国产精品久久精品| 天天操天天色综合| 国产福利一区在线观看| 在线观看日产精品| 欧美电视剧免费观看| **性色生活片久久毛片| 视频一区在线播放| 国产69精品一区二区亚洲孕妇| 91黄色小视频| 久久久99免费| 亚洲国产日产av| 国产一区二区在线看| 日本高清视频一区二区| 日韩精品一区国产麻豆| 亚洲六月丁香色婷婷综合久久 | 成人18视频日本| 欧美成人video| 日韩美女久久久|