コード例 #1
0
ファイル: process.c プロジェクト: alohays/mylysos
//태스크 스위칭 방법 중 하나
static void PspSetupTaskSWEnv(void)
{
	HANDLE current_thread, next_thread;

	current_thread = PsGetCurrentThread();

	next_thread = PspFindNextThreadScheduled();

	if(PsGetThreadPtr(current_thread)->thread_status == THREAD_STATUS_TERMINATED) {
		if(PsGetThreadPtr(current_thread)->auto_delete) {
			PsDeleteThread(current_thread);
		}
	} else if(PsGetThreadPtr(current_thread)->thread_status == THREAD_STATUS_RUNNING) {
		PsGetThreadPtr(current_thread)->thread_status = THREAD_STATUS_READY;
	}

	if(current_thread != next_thread && next_thread != NULL) {
		HalWriteTssIntoGdt(&PsGetThreadPtr(next_thread)->thread_tss32, sizeof(TSS_32), TASK_SW_SEG, TRUE);
		PsGetThreadPtr(next_thread)->thread_status = THREAD_STATUS_RUNNING;
	}
}
コード例 #2
0
ファイル: process.c プロジェクト: na94ojt/MyPlayground
static void PspSetupTaskSWEnv(void)
{
	HANDLE current_thread, next_thread;

	/* get threads */
	current_thread = PsGetCurrentThread();
	next_thread = PspFindNextThreadScheduled();	/* at this time, current thread is changed with new thing */

	if(PsGetThreadPtr(current_thread)->thread_status == THREAD_STATUS_TERMINATED) {
		/* auto delete? */
		if(PsGetThreadPtr(current_thread)->auto_delete) {
			PsDeleteThread(current_thread);
		}
	} else if(PsGetThreadPtr(current_thread)->thread_status == THREAD_STATUS_RUNNING) {
		PsGetThreadPtr(current_thread)->thread_status = THREAD_STATUS_READY;
	}

	/* task switching */
	if(current_thread != next_thread && next_thread != NULL) {
		HalWriteTssIntoGdt(&PsGetThreadPtr(next_thread)->thread_tss32, sizeof(TSS_32), TASK_SW_SEG, TRUE);
		PsGetThreadPtr(next_thread)->thread_status = THREAD_STATUS_RUNNING;
	}
}