diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index b1b208081..8e3306c46 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -55,6 +55,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/ke/kthread.cc ${XTOSKRNL_SOURCE_DIR}/ke/kubsan.cc ${XTOSKRNL_SOURCE_DIR}/ke/runlevel.cc + ${XTOSKRNL_SOURCE_DIR}/ke/schedule.cc ${XTOSKRNL_SOURCE_DIR}/ke/semphore.cc ${XTOSKRNL_SOURCE_DIR}/ke/shdata.cc ${XTOSKRNL_SOURCE_DIR}/ke/spinlock.cc diff --git a/xtoskrnl/includes/ke.hh b/xtoskrnl/includes/ke.hh index 917817c30..005125867 100644 --- a/xtoskrnl/includes/ke.hh +++ b/xtoskrnl/includes/ke.hh @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include diff --git a/xtoskrnl/includes/ke/schedule.hh b/xtoskrnl/includes/ke/schedule.hh new file mode 100644 index 000000000..de05c1e4f --- /dev/null +++ b/xtoskrnl/includes/ke/schedule.hh @@ -0,0 +1,25 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/includes/ke/schedule.hh + * DESCRIPTION: XT Kernel Thread Scheduler + * DEVELOPERS: Aiken Harris + */ + +#ifndef __XTOSKRNL_KE_SCHEDULE_HH +#define __XTOSKRNL_KE_SCHEDULE_HH + +#include + + +/* Kernel Library */ +namespace KE +{ + class Scheduler + { + public: + STATIC XTFASTCALL VOID InsertDeferredReadyList(IN PKTHREAD Thread); + }; +} + +#endif /* __XTOSKRNL_KE_SCHEDULE_HH */ diff --git a/xtoskrnl/ke/schedule.cc b/xtoskrnl/ke/schedule.cc new file mode 100644 index 000000000..64deb6b75 --- /dev/null +++ b/xtoskrnl/ke/schedule.cc @@ -0,0 +1,37 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/ke/schedule.cc + * DESCRIPTION: XT Kernel Thread Scheduler + * DEVELOPERS: Aiken Harris + */ + +#include + + +/** + * Inserts a thread into the current processor's deferred ready list. + * + * @param Thread + * Supplies a pointer to the thread being deferred. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTFASTCALL +VOID +KE::Scheduler::InsertDeferredReadyList(IN PKTHREAD Thread) +{ + PKPROCESSOR_CONTROL_BLOCK Prcb; + + /* Retrieve the Processor Control Block (PRCB) for the executing core */ + Prcb = KE::Processor::GetCurrentProcessorControlBlock(); + + /* Tag the thread with the current CPU and update its scheduling state */ + Thread->DeferredProcessor = Prcb->CpuNumber; + Thread->State = DeferredReady; + + /* Insert the thread into the deferred ready list */ + RTL::LifoQueue::PushEntryList(&Prcb->DeferredReadyListHead, &Thread->SwapListEntry); +}