diff options
Diffstat (limited to 'dev/kernel/src')
| -rw-r--r-- | dev/kernel/src/HardwareThreadScheduler.cc | 15 | ||||
| -rw-r--r-- | dev/kernel/src/MemoryMgr.cc | 15 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessScheduler.cc | 58 |
3 files changed, 35 insertions, 53 deletions
diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc index 09c1c7d8..b801632c 100644 --- a/dev/kernel/src/HardwareThreadScheduler.cc +++ b/dev/kernel/src/HardwareThreadScheduler.cc @@ -57,19 +57,6 @@ ThreadKind& HardwareThread::Kind() noexcept { //! @return whether the thread is busy or not. /***********************************************************************************/ Bool HardwareThread::IsBusy() noexcept { - STATIC Int64 busy_timer = 0U; - constexpr Int64 kTimeoutMax = - 0x1000000; // an arbitrary value used to tell if the timeout hasn't been reached yet. - - if (fBusy && (busy_timer > kTimeoutMax)) { - busy_timer = 0U; - fBusy = No; - - return No; - } - - ++busy_timer; - return fBusy; } @@ -105,8 +92,6 @@ Void HardwareThread::Wake(const bool wakeup) noexcept { /// @retval false stack is invalid, previous code is running. /***********************************************************************************/ Bool HardwareThread::Switch(HAL::StackFramePtr frame) { - if (this->IsBusy()) return NO; - this->fStack = frame; Bool ret = mp_register_process(fStack, this->fPID); diff --git a/dev/kernel/src/MemoryMgr.cc b/dev/kernel/src/MemoryMgr.cc index f8aa14cf..efb9a35f 100644 --- a/dev/kernel/src/MemoryMgr.cc +++ b/dev/kernel/src/MemoryMgr.cc @@ -93,21 +93,6 @@ namespace Detail { STATIC PageMgr kPageMgr; -/// @brief Declare a new size for ptr_ptr. -/// @param ptr_ptr the pointer. -/// @return Newly allocated heap header. -_Output auto mm_realloc_ptr(VoidPtr ptr_ptr, SizeT new_sz) -> VoidPtr { - if (Detail::mm_check_ptr_address(ptr_ptr) == No) return nullptr; - - if (!ptr_ptr || new_sz < 1) return nullptr; - - kout << "MemoryMgr: This function is not implemented by the kernel yet.\r"; - - ke_panic(RUNTIME_CHECK_INVALID); - - return nullptr; -} - /// @brief Allocate chunk of memory. /// @param sz Size of pointer /// @param wr Read Write bit. diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 393f1419..0de38532 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -492,28 +492,24 @@ SizeT UserProcessScheduler::Run() noexcept { //! Check if the process needs to be run. if (UserProcessHelper::CanBeScheduled(process)) { - kout << ((*process.Name) ? process.Name : "USER_PROCESS") << " will be scheduled...\r"; - - process.PTime = static_cast<Int32>(process.Affinity); - - if (process.PTime < process.RTime && AffinityKind::kRealTime != process.Affinity) { - if (process.RTime < (Int32) AffinityKind::kVeryHigh) - process.RTime = (Int32) AffinityKind::kLowUsage / 2; - else if (process.RTime < (Int32) AffinityKind::kHigh) - process.RTime = (Int32) AffinityKind::kStandard / 3; - else if (process.RTime < (Int32) AffinityKind::kStandard) - process.RTime = (Int32) AffinityKind::kHigh / 4; - - process.PTime -= process.RTime; - process.RTime = 0UL; - } - - if (!UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { - continue; + kout << process.Name << " will be scheduled...\r"; + + if (UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { + process.PTime = static_cast<Int32>(process.Affinity); + + if (process.PTime < process.RTime && AffinityKind::kRealTime != process.Affinity) { + if (process.RTime < (Int32) AffinityKind::kVeryHigh) + process.RTime = (Int32) AffinityKind::kLowUsage / 2; + else if (process.RTime < (Int32) AffinityKind::kHigh) + process.RTime = (Int32) AffinityKind::kStandard / 3; + else if (process.RTime < (Int32) AffinityKind::kStandard) + process.RTime = (Int32) AffinityKind::kHigh / 4; + + process.PTime -= process.RTime; + process.RTime = 0UL; + } } } else { - kout << ((*process.Name) ? process.Name : "USER_PROCESS") << " will be scheduled later...\r"; - ++process.RTime; --process.PTime; } @@ -607,13 +603,19 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { (Void)(kout << "AP_" << hex_number(index) << kendl); + if (HardwareThreadScheduler::The()[index].Leak()->IsBusy()) { + (Void)(kout << "AP_" << hex_number(index)); + kout << " is busy\r"; + continue; + } + //////////////////////////////////////////////////////////// /// Prepare task switch. /// //////////////////////////////////////////////////////////// HardwareThreadScheduler::The()[index].Leak()->Busy(YES); + Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr); - HardwareThreadScheduler::The()[index].Leak()->Busy(NO); //////////////////////////////////////////////////////////// /// Rollback on fail. /// @@ -642,13 +644,23 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { /// @brief this checks if any process is on the team. //////////////////////////////////////////////////////////// UserProcessScheduler::operator bool() { - return mTeam.AsArray().Count() > 0; + for (auto process_index = 0UL; process_index < mTeam.AsArray().Count(); ++process_index) { + auto& process = mTeam.AsArray()[process_index]; + if (UserProcessHelper::CanBeScheduled(process)) return true; + } + + return false; } //////////////////////////////////////////////////////////// /// @brief this checks if no process is on the team. //////////////////////////////////////////////////////////// Bool UserProcessScheduler::operator!() { - return mTeam.AsArray().Count() == 0; + for (auto process_index = 0UL; process_index < mTeam.AsArray().Count(); ++process_index) { + auto& process = mTeam.AsArray()[process_index]; + if (UserProcessHelper::CanBeScheduled(process)) return false; + } + + return true; } } // namespace Kernel |
