//태스크 스위칭 방법 중 하나 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; } }
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; } }