summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--compile_flags.txt1
-rw-r--r--src/boot/src/New+Delete.cpp8
-rw-r--r--src/kernel/FSKit/OpenHeFS.h2
-rw-r--r--src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp2
-rw-r--r--src/kernel/HALKit/ARM64/HalCoreInterruptHandler.cpp2
-rw-r--r--src/kernel/KernelKit/BinaryMutex.h5
-rw-r--r--src/kernel/KernelKit/CoreProcessScheduler.h2
-rw-r--r--src/kernel/KernelKit/DriveMgr.h6
-rw-r--r--src/kernel/KernelKit/FileMgr.h21
-rw-r--r--src/kernel/KernelKit/HardwareThreadScheduler.h1
-rw-r--r--src/kernel/KernelKit/User.h (renamed from src/kernel/KernelKit/UserMgr+User.h)0
-rw-r--r--src/kernel/KernelKit/UserMgr.h2
-rw-r--r--src/kernel/KernelKit/UserProcessScheduler.h7
-rw-r--r--src/kernel/NeKit/New.h6
-rw-r--r--src/kernel/src/BinaryMutex.cpp45
-rw-r--r--src/kernel/src/FS/NeFS+FileSystemParser.cpp2
-rw-r--r--src/kernel/src/FS/OpenHeFS+FileMgr.cpp7
-rw-r--r--src/kernel/src/FS/OpenHeFS+FileSystemParser.cpp2
-rw-r--r--src/kernel/src/New+Delete.cpp8
-rw-r--r--src/kernel/src/PageMgr.cpp2
-rw-r--r--src/kernel/src/User.cpp4
-rw-r--r--src/kernel/src/UserProcessScheduler.cpp18
22 files changed, 88 insertions, 65 deletions
diff --git a/compile_flags.txt b/compile_flags.txt
index 362ffe20..51003cd9 100644
--- a/compile_flags.txt
+++ b/compile_flags.txt
@@ -16,6 +16,7 @@
-Ipublic/frameworks
-Isrc/boot/BootKit
-Itools/
+-D__BOOTZ_STANDALONE__
-I./
-std=c++20
-D__NE_AMD64__
diff --git a/src/boot/src/New+Delete.cpp b/src/boot/src/New+Delete.cpp
index 70ab1dcd..f3f3d753 100644
--- a/src/boot/src/New+Delete.cpp
+++ b/src/boot/src/New+Delete.cpp
@@ -37,7 +37,7 @@ void* operator new[](size_t sz) {
/// @brief Deletes the object.
/// @param buf the object.
-void operator delete(void* buf) {
+void operator delete(void* buf) noexcept {
if (!buf) return;
BS->FreePool(buf);
@@ -45,7 +45,7 @@ void operator delete(void* buf) {
/// @brief Deletes the object.
/// @param buf the object.
-void operator delete[](void* buf) {
+void operator delete[](void* buf) noexcept {
if (!buf) return;
BS->FreePool(buf);
@@ -54,7 +54,7 @@ void operator delete[](void* buf) {
/// @brief Deletes the object (array specific).
/// @param buf the object.
/// @param size it's size.
-void operator delete(void* buf, size_t size) {
+void operator delete(void* buf, size_t size) noexcept {
if (!buf) return;
SetMem(buf, 0, size);
@@ -64,7 +64,7 @@ void operator delete(void* buf, size_t size) {
/// @brief Deletes the object (array specific).
/// @param buf the object.
/// @param size it's size.
-void operator delete[](void* buf, size_t size) {
+void operator delete[](void* buf, size_t size) noexcept {
if (!buf) return;
SetMem(buf, 0, size);
diff --git a/src/kernel/FSKit/OpenHeFS.h b/src/kernel/FSKit/OpenHeFS.h
index a642c299..1e3c3921 100644
--- a/src/kernel/FSKit/OpenHeFS.h
+++ b/src/kernel/FSKit/OpenHeFS.h
@@ -8,7 +8,7 @@
#include <CompilerKit/CompilerKit.h>
#include <KernelKit/DriveMgr.h>
-#include <KernelKit/UserMgr+User.h>
+#include <KernelKit/User.h>
#include <NeKit/Config.h>
#include <NeKit/Crc32.h>
#include <NeKit/KString.h>
diff --git a/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp b/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp
index 92fb064c..118dd98c 100644
--- a/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp
+++ b/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp
@@ -5,7 +5,7 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/ProcessScheduler.h>
-#include <KernelKit/UserMgr+User.h>
+#include <KernelKit/User.h>
#include <NeKit/Atom.h>
#include <NeKit/KString.h>
#include <SignalKit/Signals.h>
diff --git a/src/kernel/HALKit/ARM64/HalCoreInterruptHandler.cpp b/src/kernel/HALKit/ARM64/HalCoreInterruptHandler.cpp
index 39f12705..1e3adadf 100644
--- a/src/kernel/HALKit/ARM64/HalCoreInterruptHandler.cpp
+++ b/src/kernel/HALKit/ARM64/HalCoreInterruptHandler.cpp
@@ -5,7 +5,7 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/ProcessScheduler.h>
-#include <KernelKit/UserMgr+User.h>
+#include <KernelKit/User.h>
#include <NeKit/KString.h>
#include <SignalKit/Signals.h>
diff --git a/src/kernel/KernelKit/BinaryMutex.h b/src/kernel/KernelKit/BinaryMutex.h
index 2fb390d3..2388c50a 100644
--- a/src/kernel/KernelKit/BinaryMutex.h
+++ b/src/kernel/KernelKit/BinaryMutex.h
@@ -7,6 +7,7 @@
#define KERNELKIT_BINARYMUTEX_H
#include <CompilerKit/CompilerKit.h>
+#include <KernelKit/CoreProcessScheduler.h>
#include <KernelKit/Timer.h>
#include <NeKit/Config.h>
@@ -14,6 +15,7 @@ namespace Kernel {
class UserProcess;
/// @brief Access control class, which locks a task until one is done.
+/// Implements priority inheritance to prevent priority inversion.
class BinaryMutex final {
public:
using LockedPtr = UserProcess*;
@@ -36,7 +38,8 @@ class BinaryMutex final {
NE_COPY_DEFAULT(BinaryMutex)
private:
- LockedPtr fLockingProcess{nullptr};
+ LockedPtr fLockingProcess{nullptr};
+ AffinityKind fOwnerOriginalAffinity{AffinityKind::kInvalid}; // for priority inheritance
};
} // namespace Kernel
diff --git a/src/kernel/KernelKit/CoreProcessScheduler.h b/src/kernel/KernelKit/CoreProcessScheduler.h
index 2f105036..5d6dc9b3 100644
--- a/src/kernel/KernelKit/CoreProcessScheduler.h
+++ b/src/kernel/KernelKit/CoreProcessScheduler.h
@@ -146,7 +146,7 @@ enum struct ProcessStatusKind : Int32 {
/***********************************************************************************/
enum struct AffinityKind : Int32 {
kInvalid = 0,
- kUltraHigh = 100,
+ kUltraHigh = 100,
kVeryHigh = 150,
kHigh = 200,
kStandard = 1000,
diff --git a/src/kernel/KernelKit/DriveMgr.h b/src/kernel/KernelKit/DriveMgr.h
index 76ee5dcf..8b095f05 100644
--- a/src/kernel/KernelKit/DriveMgr.h
+++ b/src/kernel/KernelKit/DriveMgr.h
@@ -3,8 +3,8 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-#ifndef INC_DRIVE_MANAGER_H
-#define INC_DRIVE_MANAGER_H
+#ifndef KERNELKIT_DRIVEMGR_H
+#define KERNELKIT_DRIVEMGR_H
/// @file DriveMgr.h
/// @brief NeKernel's drive manager.
@@ -166,4 +166,4 @@ Void io_drv_input(DriveTrait::DrivePacket pckt);
Void io_drv_output(DriveTrait::DrivePacket pckt);
} // namespace Kernel
-#endif /* ifndef INC_DRIVE_MANAGER_H */
+#endif /* ifndef KERNELKIT_DRIVEMGR_H */
diff --git a/src/kernel/KernelKit/FileMgr.h b/src/kernel/KernelKit/FileMgr.h
index 87644e68..06af3c2d 100644
--- a/src/kernel/KernelKit/FileMgr.h
+++ b/src/kernel/KernelKit/FileMgr.h
@@ -3,14 +3,14 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-#ifndef INC_FILEMGR_H
-#define INC_FILEMGR_H
+#ifndef KERNELKIT_FILEMGR_H
+#define KERNELKIT_FILEMGR_H
/// @file FileMgr.h
/// @brief File Manager Subsystem.
/// @author Amlal El Mahrouss (amlal@nekernel.org)
-//! Include filesystems that NeKernel supports.
+//! Include filesystems that the hybrid kernel supports.
#include <FSKit/Ext2+IFS.h>
#include <FSKit/NeFS.h>
#include <FSKit/OpenHeFS.h>
@@ -352,7 +352,7 @@ class FileStream final {
/// @brief Leak MIME.
/// @return The MIME.
- Char* MIME() { return const_cast<Char*>(fMime); }
+ Char* MIME() { return fMime; }
enum {
kFileMgrRestrictRead = 100,
@@ -364,14 +364,15 @@ class FileStream final {
};
private:
- NodePtr fFile{nullptr};
- Int32 fFileRestrict{kFileMgrRestrictReadBinary};
- const Char* fMime{kFileMimeGeneric};
+ NodePtr fFile{nullptr};
+ Int32 fFileRestrict{kFileMgrRestrictReadBinary};
+ Char* fMime{const_cast<Char*>(kFileMimeGeneric)};
};
using FileStreamASCII = FileStream<Char>;
using FileStreamUTF8 = FileStream<Utf8Char>;
-using FileStreamUTF16 = FileStream<WideChar>;
+using FileStreamUTF16 = FileStream<Utf16Char>;
+using FileStreamWide = FileStream<WideChar>;
typedef UInt64 CursorType;
@@ -423,9 +424,9 @@ inline FileStream<Encoding, Class>::FileStream(const Encoding* path, const Encod
/// @brief destructor of the file stream.
template <typename Encoding, typename Class>
inline FileStream<Encoding, Class>::~FileStream() {
- mm_free_ptr(fFile);
+ if (fFile) mm_free_ptr(fFile);
fFile = nullptr;
}
} // namespace Kernel
-#endif // ifndef INC_FILEMGR_H
+#endif // ifndef KERNELKIT_FILEMGR_H
diff --git a/src/kernel/KernelKit/HardwareThreadScheduler.h b/src/kernel/KernelKit/HardwareThreadScheduler.h
index a9183cd2..43a906d6 100644
--- a/src/kernel/KernelKit/HardwareThreadScheduler.h
+++ b/src/kernel/KernelKit/HardwareThreadScheduler.h
@@ -12,6 +12,7 @@
/// @note Last Rev Sun 28 Jul CET 2024
/// @note Last Rev Thu, Aug 1, 2024 9:07:38 AM
+/// @note Last Rev Sun, March 22, 2026 5:16 PM
#if defined(__nekernel_max_cores)
/// \note This can be edited at compile-time to specify how many cores can be used by NeKernel.
diff --git a/src/kernel/KernelKit/UserMgr+User.h b/src/kernel/KernelKit/User.h
index bae51180..bae51180 100644
--- a/src/kernel/KernelKit/UserMgr+User.h
+++ b/src/kernel/KernelKit/User.h
diff --git a/src/kernel/KernelKit/UserMgr.h b/src/kernel/KernelKit/UserMgr.h
index 16ca79b6..7fc2b635 100644
--- a/src/kernel/KernelKit/UserMgr.h
+++ b/src/kernel/KernelKit/UserMgr.h
@@ -6,6 +6,6 @@
#ifndef KERNELKIT_USERMGR_H
#define KERNELKIT_USERMGR_H
-#include <KernelKit/UserMgr+User.h>
+#include <KernelKit/User.h>
#endif \ No newline at end of file
diff --git a/src/kernel/KernelKit/UserProcessScheduler.h b/src/kernel/KernelKit/UserProcessScheduler.h
index 5018f1f6..1318c7f6 100644
--- a/src/kernel/KernelKit/UserProcessScheduler.h
+++ b/src/kernel/KernelKit/UserProcessScheduler.h
@@ -13,7 +13,7 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/CoreProcessScheduler.h>
#include <KernelKit/LockDelegate.h>
-#include <KernelKit/UserMgr+User.h>
+#include <KernelKit/User.h>
#include <NeKit/MutableArray.h>
////////////////////////////////////////////////////
@@ -83,9 +83,10 @@ class UserProcess final {
kExecutableKindCount,
};
- ProcessTime PTime{0}; //! @brief Process allocated tine.
+ ProcessTime PTime{0}; //! @brief Process allocated time.
ProcessTime RTime{0}; //! @brief Process run time.
- ProcessTime UTime{0}; //! #brief Process used time.
+ ProcessTime UTime{0}; //! @brief Process used time.
+ ProcessTime STime{0}; //! @brief Process sleep time (for dynamic priority boost).
ProcessID ProcessId{kCPSInvalidPID};
ExecutableKind Kind{ExecutableKind::kExecutableKind};
diff --git a/src/kernel/NeKit/New.h b/src/kernel/NeKit/New.h
index 648f4a20..9b601534 100644
--- a/src/kernel/NeKit/New.h
+++ b/src/kernel/NeKit/New.h
@@ -14,8 +14,8 @@ typedef __SIZE_TYPE__ size_t;
void* operator new(size_t);
void* operator new[](size_t);
-void operator delete(void*);
-void operator delete(void*, unsigned long);
-void operator delete[](void*);
+void operator delete(void*) noexcept;
+void operator delete(void*, unsigned long) noexcept;
+void operator delete[](void*) noexcept;
#endif
diff --git a/src/kernel/src/BinaryMutex.cpp b/src/kernel/src/BinaryMutex.cpp
index c5fd6a50..eb559f98 100644
--- a/src/kernel/src/BinaryMutex.cpp
+++ b/src/kernel/src/BinaryMutex.cpp
@@ -7,23 +7,14 @@
#include <KernelKit/ProcessScheduler.h>
namespace Kernel {
-/***********************************************************************************/
-/// @brief Unlocks the binary mutex.
-/***********************************************************************************/
-
-#ifndef __NE_TIMEOUT_CONFIG__
-#define __NE_TIMEOUT_CONFIG__ 10000
-#endif
Bool BinaryMutex::Unlock() {
- auto timeout = 0UL;
- constexpr auto kTimoutLimit = __NE_TIMEOUT_CONFIG__;
+ if (!fLockingProcess) return No;
- while (fLockingProcess->Status == ProcessStatusKind::kRunning) {
- ++timeout;
-
- if (timeout > kTimoutLimit)
- return No;
+ // restore original priority if we boosted the owner
+ if (fOwnerOriginalAffinity != AffinityKind::kInvalid) {
+ fLockingProcess->Affinity = fOwnerOriginalAffinity;
+ fOwnerOriginalAffinity = AffinityKind::kInvalid;
}
fLockingProcess = nullptr;
@@ -35,9 +26,20 @@ Bool BinaryMutex::Unlock() {
/***********************************************************************************/
Bool BinaryMutex::Lock(BinaryMutex::LockedPtr process) {
- if (!process || this->IsLocked()) return No;
+ if (!process) return No;
+
+ // if already locked, implement priority inheritance
+ if (this->IsLocked() && fLockingProcess) {
+ // boost owner to waiter's priority if waiter is higher priority (lower value = higher priority)
+ if (process->Affinity < fLockingProcess->Affinity) {
+ fOwnerOriginalAffinity = fLockingProcess->Affinity;
+ fLockingProcess->Affinity = process->Affinity;
+ }
+ return No; // lock not acquired, but owner boosted
+ }
- this->fLockingProcess = process;
+ this->fLockingProcess = process;
+ fOwnerOriginalAffinity = AffinityKind::kInvalid;
return Yes;
}
@@ -51,15 +53,18 @@ Bool BinaryMutex::IsLocked() const {
}
/***********************************************************************************/
-/// @brief Try lock or wait.
+/// @brief Try lock, waiting until timeout if already locked.
/***********************************************************************************/
Bool BinaryMutex::LockAndWait(BinaryMutex::LockedPtr process, ITimer* timer) {
- if (timer == nullptr) return No;
+ if (timer == nullptr || !process) return No;
+
+ // try to acquire lock immediately
+ if (this->Lock(process)) return Yes;
+ // wait and retry
timer->Wait();
- this->Lock(process);
- return this->Unlock();
+ return this->Lock(process);
}
/***********************************************************************************/
diff --git a/src/kernel/src/FS/NeFS+FileSystemParser.cpp b/src/kernel/src/FS/NeFS+FileSystemParser.cpp
index 42fb36a8..36b63ec7 100644
--- a/src/kernel/src/FS/NeFS+FileSystemParser.cpp
+++ b/src/kernel/src/FS/NeFS+FileSystemParser.cpp
@@ -12,7 +12,7 @@
#include <KernelKit/IFS.h>
#include <KernelKit/KPC.h>
#include <KernelKit/ProcessScheduler.h>
-#include <KernelKit/UserMgr+User.h>
+#include <KernelKit/User.h>
#include <NeKit/Crc32.h>
#include <NeKit/KString.h>
#include <NeKit/KernelPanic.h>
diff --git a/src/kernel/src/FS/OpenHeFS+FileMgr.cpp b/src/kernel/src/FS/OpenHeFS+FileMgr.cpp
index a0a649eb..773ed5da 100644
--- a/src/kernel/src/FS/OpenHeFS+FileMgr.cpp
+++ b/src/kernel/src/FS/OpenHeFS+FileMgr.cpp
@@ -221,10 +221,6 @@ _Output VoidPtr HeFileSystemMgr::Read(_Input NodePtr node, _Input Int32 flags, _
Void HeFileSystemMgr::Write(_Input const Char* name, _Input NodePtr node, _Input VoidPtr data,
_Input Int32 flags, _Input SizeT size) {
NE_UNUSED(node);
- // NE_UNUSED(flags);
- // NE_UNUSED(size);
- // NE_UNUSED(name);
- // NE_UNUSED(data);
if (!flags) return;
if (!size) return;
@@ -260,6 +256,7 @@ _Output VoidPtr HeFileSystemMgr::Read(_Input const Char* name, _Input NodePtr no
_Output Bool HeFileSystemMgr::Seek(NodePtr node, SizeT off) {
if (this->Tell(node) == kFileMgrNPos) return false;
+ kout << "The Method is not implemented in the Hybrid kernel.\r";
return off > 0;
}
@@ -269,7 +266,7 @@ _Output Bool HeFileSystemMgr::Seek(NodePtr node, SizeT off) {
_Output SizeT HeFileSystemMgr::Tell(NodePtr node) {
if (!node) return kFileMgrNPos;
SizeT pos = 0ULL;
-
+ kout << "The Method is not implemented in the Hybrid kernel.\r";
return pos;
}
diff --git a/src/kernel/src/FS/OpenHeFS+FileSystemParser.cpp b/src/kernel/src/FS/OpenHeFS+FileSystemParser.cpp
index b923d13f..6f980730 100644
--- a/src/kernel/src/FS/OpenHeFS+FileSystemParser.cpp
+++ b/src/kernel/src/FS/OpenHeFS+FileSystemParser.cpp
@@ -10,7 +10,7 @@
#include <FirmwareKit/GPT.h>
#include <KernelKit/KPC.h>
#include <KernelKit/ProcessScheduler.h>
-#include <KernelKit/UserMgr+User.h>
+#include <KernelKit/User.h>
#include <NeKit/Crc32.h>
#include <NeKit/KString.h>
#include <NeKit/KernelPanic.h>
diff --git a/src/kernel/src/New+Delete.cpp b/src/kernel/src/New+Delete.cpp
index 9ec34c6f..6e4dd79a 100644
--- a/src/kernel/src/New+Delete.cpp
+++ b/src/kernel/src/New+Delete.cpp
@@ -18,19 +18,19 @@ void* operator new(size_t sz) {
return Kernel::mm_alloc_ptr(sz, true, false);
}
-void operator delete[](void* ptr) {
+void operator delete[](void* ptr) noexcept {
if (ptr == nullptr) return;
Kernel::mm_free_ptr(ptr);
}
-void operator delete(void* ptr) {
+void operator delete(void* ptr) noexcept {
if (ptr == nullptr) return;
Kernel::mm_free_ptr(ptr);
}
-void operator delete(void* ptr, size_t sz) {
+void operator delete(void* ptr, size_t sz) noexcept {
if (ptr == nullptr) return;
NE_UNUSED(sz);
@@ -38,7 +38,7 @@ void operator delete(void* ptr, size_t sz) {
Kernel::mm_free_ptr(ptr);
}
-void operator delete[](void* ptr, size_t sz) {
+void operator delete[](void* ptr, size_t sz) noexcept {
if (ptr == nullptr) return;
NE_UNUSED(sz);
diff --git a/src/kernel/src/PageMgr.cpp b/src/kernel/src/PageMgr.cpp
index f0a8b346..0ed16767 100644
--- a/src/kernel/src/PageMgr.cpp
+++ b/src/kernel/src/PageMgr.cpp
@@ -13,7 +13,7 @@
#endif // ifdef __NE_AMD64__ || defined(__NE_ARM64__)
namespace Kernel {
-
+
PTEWrapper::PTEWrapper(Boolean Rw, Boolean User, Boolean ExecDisable, UIntPtr VirtAddr)
: fRw(Rw),
fUser(User),
diff --git a/src/kernel/src/User.cpp b/src/kernel/src/User.cpp
index 2e626b03..3f5bb66a 100644
--- a/src/kernel/src/User.cpp
+++ b/src/kernel/src/User.cpp
@@ -7,12 +7,12 @@
#include <KernelKit/HeapMgr.h>
#include <KernelKit/KPC.h>
#include <KernelKit/ThreadLocalStorage.h>
-#include <KernelKit/UserMgr+User.h>
+#include <KernelKit/User.h>
#include <NeKit/KString.h>
#include <NeKit/KernelPanic.h>
#include <NeKit/Utils.h>
-/// @file UserMgr+User.cpp
+/// @file User.cpp
/// @brief Multi-user support.
namespace Kernel {
diff --git a/src/kernel/src/UserProcessScheduler.cpp b/src/kernel/src/UserProcessScheduler.cpp
index 8c048f07..a8ef1799 100644
--- a/src/kernel/src/UserProcessScheduler.cpp
+++ b/src/kernel/src/UserProcessScheduler.cpp
@@ -406,6 +406,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im
process.PTime = 0;
process.UTime = 0;
process.RTime = 0;
+ process.STime = 0;
if (!process.FileTree) {
process.FileTree = new ProcessFileTree<VoidPtr>();
@@ -476,7 +477,7 @@ Bool UserProcessScheduler::HasMP() {
SizeT UserProcessScheduler::Run() {
STATIC SizeT process_index{}; //! we store this guy to tell the scheduler how many
- //! things we have scheduled.
+ //! things we have scheduled.
UserProcessTeam& team = mTeam;
SizeT limit = team.AsArray().Capacity();
@@ -501,6 +502,15 @@ SizeT UserProcessScheduler::Run() {
++process.UTime;
}
+ //! boost priority for processes that slept (interactive boost)
+ if (process.STime > 0) {
+ // the longer it slept, the bigger the boost (capped at kVeryHigh level)
+ ProcessTime boost = process.STime / 10;
+ if (boost > (Int32) AffinityKind::kHigh) boost = (Int32) AffinityKind::kHigh;
+ process.PTime += boost;
+ process.STime = 0; // reset sleep counter after boost
+ }
+
this->TheCurrentProcess() = process;
if (UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) {
@@ -516,10 +526,14 @@ SizeT UserProcessScheduler::Run() {
process.PTime -= process.RTime;
process.RTime = 0UL;
} else if (AffinityKind::kUltraHigh != process.Affinity) {
- process.PTime += (Int32)AffinityKind::kUltraHigh;
+ process.PTime += (Int32) AffinityKind::kUltraHigh;
}
}
} else {
+ //! track sleep time for processes that are blocked/waiting
+ if (process.Status == ProcessStatusKind::kFrozen) {
+ ++process.STime;
+ }
++process.RTime;
--process.PTime;
}