summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit
diff options
context:
space:
mode:
Diffstat (limited to 'Private/KernelKit')
-rw-r--r--Private/KernelKit/ProcessManager.hpp266
1 files changed, 123 insertions, 143 deletions
diff --git a/Private/KernelKit/ProcessManager.hpp b/Private/KernelKit/ProcessManager.hpp
index 724dd34a..dbcd08b2 100644
--- a/Private/KernelKit/ProcessManager.hpp
+++ b/Private/KernelKit/ProcessManager.hpp
@@ -9,20 +9,20 @@
#pragma once
-#include "NewKit/Defines.hpp"
#include <ArchKit/Arch.hpp>
#include <KernelKit/FileManager.hpp>
#include <KernelKit/PermissionSelector.hxx>
-#include <NewKit/UserHeap.hpp>
#include <NewKit/LockDelegate.hpp>
#include <NewKit/MutableArray.hpp>
+#include <NewKit/UserHeap.hpp>
+
+#include "NewKit/Defines.hpp"
#define kMinMicroTime AffinityKind::kStandard
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-namespace HCore
-{
+namespace HCore {
//! @brief Process identifier.
typedef Int64 ProcessID;
@@ -35,59 +35,53 @@ class ProcessManager;
class ProcessHelper;
//! @brief Process status enum.
-enum class ProcessStatus : Int32
-{
- kStarting,
- kRunning,
- kKilled,
- kFrozen,
- kDead
+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,
- kStandard = 150,
- kLowUsage = 100,
- kVeryLowUsage = 50,
+enum class AffinityKind : Int32 {
+ kInvalid = 300,
+ kVeryHigh = 250,
+ kHigh = 200,
+ kStandard = 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);
+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;
+ 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);
+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;
+ 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);
+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;
+ 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);
+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;
+ return lhs_int >= rhs_int;
}
// end of operator overloading.
@@ -97,11 +91,10 @@ 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 */
+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.
@@ -109,126 +102,113 @@ using ImagePtr = VoidPtr;
using HeapPtr = VoidPtr;
// @brief Process header structure.
-class Process final
-{
- public:
- explicit Process(VoidPtr startImage = nullptr) : Image(startImage)
- {
- MUST_PASS(startImage);
- }
- ~Process() = default;
-
- HCORE_COPY_DEFAULT(Process)
-
- public:
- void AssignStart(UIntPtr &imageStart) noexcept;
-
- public:
- Char Name[kProcessLen] = {"HCore Process"};
- ProcessSubsystem SubSystem;
- ProcessSelector Selector;
- HAL::StackFrame *StackFrame{nullptr};
- AffinityKind Affinity;
- ProcessStatus Status;
-
- // Memory, images.
- HeapPtr PoolCursor{nullptr};
- ImagePtr Image{nullptr};
- HeapPtr Pool{nullptr};
-
- // memory usage
- SizeT UsedMemory{0};
- SizeT FreeMemory{0};
-
- ProcessTime PTime;
- PID ProcessId{-1};
- Int32 Ring{3};
-
- public:
- //! @brief boolean operator, check status.
- operator bool()
- {
- return Status != ProcessStatus::kDead;
- }
-
- //! @brief Crash program, exits with code ~0.
- void Crash();
-
- //! @brief Exits program.
- void Exit(Int32 exit_code = 0);
-
- //! @brief TLS new
- VoidPtr New(const SizeT &sz);
-
- //! @brief TLS delete.
- Boolean Delete(VoidPtr ptr, const SizeT &sz);
-
- //! @brief Process name getter, example: "C RunTime"
- const Char *GetName();
-
- //! @brief Wakes up threads.
- void Wake(const bool wakeup = false);
-
- public:
- const ProcessSelector &GetSelector();
- const ProcessStatus &GetStatus();
- const AffinityKind &GetAffinity();
-
- private:
- friend ProcessManager;
- friend ProcessHelper;
+class Process final {
+ public:
+ explicit Process(VoidPtr startImage = nullptr) : Image(startImage) {
+ MUST_PASS(startImage);
+ }
+ ~Process() = default;
+
+ HCORE_COPY_DEFAULT(Process)
+
+ public:
+ void AssignStart(UIntPtr &imageStart) noexcept;
+
+ public:
+ Char Name[kProcessLen] = {"HCore Process"};
+ ProcessSubsystem SubSystem;
+ ProcessSelector Selector;
+ HAL::StackFrame *StackFrame{nullptr};
+ AffinityKind Affinity;
+ ProcessStatus Status;
+
+ // Memory, images.
+ HeapPtr PoolCursor{nullptr};
+ ImagePtr Image{nullptr};
+ HeapPtr Pool{nullptr};
+
+ // memory usage
+ SizeT UsedMemory{0};
+ SizeT FreeMemory{0};
+
+ ProcessTime PTime;
+ PID ProcessId{-1};
+ Int32 Ring{3};
+
+ public:
+ //! @brief boolean operator, check status.
+ operator bool() { return Status != ProcessStatus::kDead; }
+
+ //! @brief Crash program, exits with code ~0.
+ void Crash();
+
+ //! @brief Exits program.
+ void Exit(Int32 exit_code = 0);
+
+ //! @brief TLS Allocate
+ VoidPtr New(const SizeT &sz);
+
+ //! @brief TLS Free.
+ Boolean Delete(VoidPtr ptr, const SizeT &sz);
+
+ //! @brief Process name getter, example: "C RunTime"
+ const Char *GetName();
+
+ //! @brief Wakes up threads.
+ void Wake(const bool wakeup = false);
+
+ public:
+ const ProcessSelector &GetSelector();
+ const ProcessStatus &GetStatus();
+ const AffinityKind &GetAffinity();
+
+ private:
+ friend ProcessManager;
+ friend ProcessHelper;
};
using ProcessPtr = Process *;
//! @brief Kernel scheduler..
-class ProcessManager final
-{
- private:
- explicit ProcessManager() = default;
+class ProcessManager final {
+ private:
+ explicit ProcessManager() = default;
- public:
- ~ProcessManager() = default;
+ public:
+ ~ProcessManager() = default;
- HCORE_COPY_DEFAULT(ProcessManager)
+ HCORE_COPY_DEFAULT(ProcessManager)
- operator bool()
- {
- return m_Headers.Count() > 0;
- }
- bool operator!()
- {
- return m_Headers.Count() == 0;
- }
+ operator bool() { return m_Headers.Count() > 0; }
+ bool operator!() { return m_Headers.Count() == 0; }
- bool Add(Ref<Process> &Header);
- bool Remove(SizeT Header);
+ bool Add(Ref<Process> &Header);
+ bool Remove(SizeT Header);
- Ref<Process> &GetCurrent();
- SizeT Run() noexcept;
+ Ref<Process> &GetCurrent();
+ SizeT Run() noexcept;
- static Ref<ProcessManager> Shared();
+ static Ref<ProcessManager> Shared();
- private:
- MutableArray<Ref<Process>> m_Headers;
- Ref<Process> m_CurrentProcess;
+ private:
+ MutableArray<Ref<Process>> m_Headers;
+ Ref<Process> m_CurrentProcess;
};
/*
* 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<Process> &process);
- static PID &GetCurrentPID();
- static bool StartScheduling();
+class ProcessHelper final {
+ public:
+ static bool Switch(HAL::StackFrame *newStack, const PID &newPid);
+ static bool CanBeScheduled(Ref<Process> &process);
+ static PID &GetCurrentPID();
+ static bool StartScheduling();
};
const Int32 &rt_get_exit_code() noexcept;
-} // namespace HCore
+} // namespace HCore
#include <KernelKit/ThreadLocalStorage.hxx>