summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit/ProcessScheduler.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'Private/KernelKit/ProcessScheduler.hpp')
-rw-r--r--Private/KernelKit/ProcessScheduler.hpp301
1 files changed, 0 insertions, 301 deletions
diff --git a/Private/KernelKit/ProcessScheduler.hpp b/Private/KernelKit/ProcessScheduler.hpp
deleted file mode 100644
index 882aa7f0..00000000
--- a/Private/KernelKit/ProcessScheduler.hpp
+++ /dev/null
@@ -1,301 +0,0 @@
-/* -------------------------------------------
-
- Copyright Mahrouss Logic
-
-------------------------------------------- */
-
-#ifndef __PROCESS_SCHEDULER__
-#define __PROCESS_SCHEDULER__
-
-#include <ArchKit/ArchKit.hpp>
-#include <KernelKit/FileManager.hpp>
-#include <KernelKit/LockDelegate.hpp>
-#include <KernelKit/PermissionSelector.hxx>
-#include <KernelKit/UserHeap.hpp>
-#include <NewKit/MutableArray.hpp>
-
-#define kSchedMinMicroTime AffinityKind::kHartStandard
-#define kSchedInvalidPID (-1)
-
-#define kSchedProcessLimitPerTeam (100U)
-
-////////////////////////////////////////////////////
-
-// LAST REV: Mon Feb 12 13:52:01 CET 2024
-
-////////////////////////////////////////////////////
-
-namespace NewOS
-{
- class ProcessHeader;
- class ProcessTeam;
- class ProcessScheduler;
-
- //! @brief Process identifier.
- typedef Int64 ProcessID;
-
- //! @brief Process name length.
- inline constexpr SizeT kProcessLen = 256U;
-
- //! @brief Forward declaration.
- class ProcessHeader;
- class ProcessScheduler;
- class ProcessHelper;
-
- //! @brief Process status enum.
- enum class ProcessStatus : Int32
- {
- kStarting,
- kRunning,
- kKilled,
- kFrozen,
- kDead
- };
-
- //! @brief Affinity is the amount of nano-seconds this process is going
- //! to run.
- enum class AffinityKind : Int32
- {
- kInvalid = 300,
- kVeryHigh = 250,
- kHigh = 200,
- kHartStandard = 150,
- kLowUsage = 100,
- kVeryLowUsage = 50,
- };
-
- // operator overloading.
-
- inline bool operator<(AffinityKind lhs, AffinityKind rhs)
- {
- Int32 lhs_int = static_cast<Int>(lhs);
- Int32 rhs_int = static_cast<Int>(rhs);
-
- return lhs_int < rhs_int;
- }
-
- inline bool operator>(AffinityKind lhs, AffinityKind rhs)
- {
- Int32 lhs_int = static_cast<Int>(lhs);
- Int32 rhs_int = static_cast<Int>(rhs);
-
- return lhs_int > rhs_int;
- }
-
- inline bool operator<=(AffinityKind lhs, AffinityKind rhs)
- {
- Int32 lhs_int = static_cast<Int>(lhs);
- Int32 rhs_int = static_cast<Int>(rhs);
-
- return lhs_int <= rhs_int;
- }
-
- inline bool operator>=(AffinityKind lhs, AffinityKind rhs)
- {
- Int32 lhs_int = static_cast<Int>(lhs);
- Int32 rhs_int = static_cast<Int>(rhs);
-
- return lhs_int >= rhs_int;
- }
-
- // end of operator overloading.
-
- enum ProcessSubsystemEnum
- {
- eProcessSubsystemLogin,
- eProcessSubsystemNative,
- eProcessSubsystemInvalid,
- eProcessSubsystemCount,
- };
-
- using ProcessSubsystem = ProcessSubsystemEnum;
- using ProcessTime = UInt64;
- using PID = Int64;
-
- // for permission manager, tells where we run the code.
- enum class ProcessSelector : Int
- {
- kRingUser, /* user ring (or ring 3 in x86) */
- kRingDriver, /* ring 2 in x86, hypervisor privileges in other archs */
- kRingKernel, /* machine privileges */
- };
-
- // Helper types.
- using ImagePtr = VoidPtr;
- using HeapPtr = VoidPtr;
-
- // @name ProcessHeader
- // @brief Process Header (PH)
- // Holds information about the running process.
- // Thread execution is being abstracted away.
- class ProcessHeader final
- {
- public:
- explicit ProcessHeader(VoidPtr startImage = nullptr)
- : Image(startImage)
- {
- MUST_PASS(startImage);
- }
-
- ~ProcessHeader() = default;
-
- NEWOS_COPY_DEFAULT(ProcessHeader)
-
- public:
- void SetEntrypoint(UIntPtr& imageStart) noexcept;
-
- public:
- Char Name[kProcessLen] = {"NewOS Process"};
- ProcessSubsystem SubSystem{ProcessSubsystem::eProcessSubsystemInvalid};
- ProcessSelector Selector{ProcessSelector::kRingUser};
- HAL::StackFramePtr StackFrame{nullptr};
- AffinityKind Affinity;
- ProcessStatus Status;
-
- // Memory, images.
- HeapPtr HeapCursor{nullptr};
- ImagePtr Image{nullptr};
- HeapPtr HeapPtr{nullptr};
-
- // memory usage
- SizeT UsedMemory{0};
- SizeT FreeMemory{0};
-
- enum
- {
- kUserKind = 3,
- kLibKind = 3,
- kDriverKind = 0,
- kKindCount,
- };
-
- enum
- {
- kRingUserKind = 3,
- kRingDriverKind = 0,
- };
-
- ProcessTime PTime;
- PID ProcessId{kSchedInvalidPID};
- Int32 Ring{kRingDriverKind};
- Int32 Kind{kUserKind};
-
- public:
- //! @brief boolean operator, check status.
- operator bool()
- {
- return Status != ProcessStatus::kDead;
- }
-
- //! @brief Crash the app, exits with code ~0.
- void Crash();
-
- //! @brief Exits app.
- void Exit(Int32 exitCode = 0);
-
- //! @brief TLS Allocate
- VoidPtr New(const SizeT& sz);
-
- //! @brief TLS Free.
- Boolean Delete(VoidPtr ptr, const SizeT& sz);
-
- //! @brief Wakes up threads.
- void Wake(const bool wakeup = false);
-
- // ProcessHeader getters.
- public:
- //! @brief ProcessHeader name getter, example: "C RunTime"
- const Char* GetName();
-
- const ProcessSelector& GetSelector();
- const ProcessStatus& GetStatus();
- const AffinityKind& GetAffinity();
-
- private:
- friend ProcessScheduler;
- friend ProcessHelper;
- };
-
- /// \brief Processs Team (contains multiple processes inside it.)
- /// Equivalent to a process batch
- class ProcessTeam final
- {
- public:
- explicit ProcessTeam() = default;
- ~ProcessTeam() = default;
-
- NEWOS_COPY_DEFAULT(ProcessTeam);
-
- MutableArray<Ref<ProcessHeader>>& AsArray();
- Ref<ProcessHeader>& AsRef();
-
- public:
- MutableArray<Ref<ProcessHeader>> mProcessList;
- Ref<ProcessHeader> mCurrentProcess;
- };
-
- using ProcessHeaderRef = ProcessHeader*;
-
- /// @brief ProcessHeader manager class.
- /// The main class which you call to schedule an app.
- class ProcessScheduler final
- {
- private:
- explicit ProcessScheduler() = default;
-
- public:
- ~ProcessScheduler() = default;
-
- NEWOS_COPY_DEFAULT(ProcessScheduler)
-
- operator bool()
- {
- return mTeam.AsArray().Count() > 0;
- }
- bool operator!()
- {
- return mTeam.AsArray().Count() == 0;
- }
-
- ProcessTeam& CurrentTeam()
- {
- return mTeam;
- }
-
- SizeT Add(Ref<ProcessHeader>& headerRef);
- bool Remove(SizeT headerIndex);
-
- Ref<ProcessHeader>& GetCurrent();
- SizeT Run() noexcept;
-
- static Ref<ProcessScheduler> Shared();
-
- private:
- ProcessTeam mTeam;
- };
-
- /*
- * Just a helper class, which contains some utilities for the scheduler.
- */
-
- class ProcessHelper final
- {
- public:
- static bool Switch(HAL::StackFrame* newStack, const PID& newPid);
- static bool CanBeScheduled(Ref<ProcessHeader>& process);
- static PID& GetCurrentPID();
- static bool StartScheduling();
- };
-
- const Int32& rt_get_exit_code() noexcept;
-} // namespace NewOS
-
-#include <KernelKit/ThreadLocalStorage.hxx>
-
-////////////////////////////////////////////////////
-
-// END
-
-////////////////////////////////////////////////////
-
-#endif /* ifndef __PROCESS_SCHEDULER__ */