From ea937555b04ae7f39785341e45955b48515e5bf1 Mon Sep 17 00:00:00 2001 From: Amlal Date: Sun, 21 Jul 2024 09:48:52 +0200 Subject: [IMP] MHR-36: Much better ref class Signed-off-by: Amlal --- Kernel/CFKit/GUIDWizard.hpp | 2 +- Kernel/CFKit/GUIDWrapper.hpp | 2 +- Kernel/KernelKit/DeviceManager.hpp | 2 +- Kernel/KernelKit/FileManager.hpp | 2 +- Kernel/KernelKit/Framebuffer.hpp | 2 +- Kernel/KernelKit/PCI/Dma.hpp | 2 +- Kernel/KernelKit/PCI/IO.hpp | 2 +- Kernel/KernelKit/PCI/Iterator.hpp | 2 +- Kernel/KernelKit/ProcessHeap.hxx | 2 +- Kernel/KernelKit/ProcessScheduler.hxx | 2 +- Kernel/KernelKit/SMPManager.hpp | 2 +- Kernel/Modules/ACPI/ACPIFactoryInterface.hxx | 2 +- Kernel/NetworkKit/IP.hpp | 2 +- Kernel/NewKit/ErrorOr.hpp | 2 +- Kernel/NewKit/NewKit.hpp | 2 +- Kernel/NewKit/OwnPtr.hpp | 2 +- Kernel/NewKit/PageManager.hpp | 2 +- Kernel/NewKit/Pmm.hpp | 2 +- Kernel/NewKit/Ref.hpp | 98 ------------------------- Kernel/NewKit/Ref.hxx | 106 +++++++++++++++++++++++++++ Kernel/NewKit/Stream.hpp | 2 +- Kernel/Sources/GUIDWizard.cxx | 2 +- Kernel/Sources/ProcessScheduler.cxx | 8 +- Kernel/Sources/Ref.cxx | 2 +- Kernel/StorageKit/PRDT.hpp | 2 +- 25 files changed, 133 insertions(+), 123 deletions(-) delete mode 100644 Kernel/NewKit/Ref.hpp create mode 100644 Kernel/NewKit/Ref.hxx (limited to 'Kernel') diff --git a/Kernel/CFKit/GUIDWizard.hpp b/Kernel/CFKit/GUIDWizard.hpp index 43c0fd89..59e83153 100644 --- a/Kernel/CFKit/GUIDWizard.hpp +++ b/Kernel/CFKit/GUIDWizard.hpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include diff --git a/Kernel/CFKit/GUIDWrapper.hpp b/Kernel/CFKit/GUIDWrapper.hpp index c3293365..fe9e373b 100644 --- a/Kernel/CFKit/GUIDWrapper.hpp +++ b/Kernel/CFKit/GUIDWrapper.hpp @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include /* GUID for C++ Components */ diff --git a/Kernel/KernelKit/DeviceManager.hpp b/Kernel/KernelKit/DeviceManager.hpp index 125422c8..8261834d 100644 --- a/Kernel/KernelKit/DeviceManager.hpp +++ b/Kernel/KernelKit/DeviceManager.hpp @@ -19,7 +19,7 @@ /* @brief Device abstraction and I/O buffer. */ #include -#include +#include // Last Rev // Wed, Apr 3, 2024 9:09:41 AM diff --git a/Kernel/KernelKit/FileManager.hpp b/Kernel/KernelKit/FileManager.hpp index 1e9fbb75..0d721ec0 100644 --- a/Kernel/KernelKit/FileManager.hpp +++ b/Kernel/KernelKit/FileManager.hpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include /// @brief Filesystem manager, abstraction over mounted filesystem. /// Works like the VFS or IFS. diff --git a/Kernel/KernelKit/Framebuffer.hpp b/Kernel/KernelKit/Framebuffer.hpp index 170ab2a4..3d0914ef 100644 --- a/Kernel/KernelKit/Framebuffer.hpp +++ b/Kernel/KernelKit/Framebuffer.hpp @@ -11,7 +11,7 @@ #define __INC_FB_HPP__ #include -#include +#include namespace Kernel { diff --git a/Kernel/KernelKit/PCI/Dma.hpp b/Kernel/KernelKit/PCI/Dma.hpp index e5e44c0b..dfac226f 100644 --- a/Kernel/KernelKit/PCI/Dma.hpp +++ b/Kernel/KernelKit/PCI/Dma.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace Kernel { diff --git a/Kernel/KernelKit/PCI/IO.hpp b/Kernel/KernelKit/PCI/IO.hpp index 6328921d..90e9244d 100644 --- a/Kernel/KernelKit/PCI/IO.hpp +++ b/Kernel/KernelKit/PCI/IO.hpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include namespace Kernel { diff --git a/Kernel/KernelKit/PCI/Iterator.hpp b/Kernel/KernelKit/PCI/Iterator.hpp index 2274df31..0d6d894c 100644 --- a/Kernel/KernelKit/PCI/Iterator.hpp +++ b/Kernel/KernelKit/PCI/Iterator.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #define NEWOS_BUS_COUNT (256) #define NEWOS_DEVICE_COUNT (33) diff --git a/Kernel/KernelKit/ProcessHeap.hxx b/Kernel/KernelKit/ProcessHeap.hxx index d2ec4035..7772398e 100644 --- a/Kernel/KernelKit/ProcessHeap.hxx +++ b/Kernel/KernelKit/ProcessHeap.hxx @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include /// @version 5/11/23 diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx index 3f6e7828..1785e145 100644 --- a/Kernel/KernelKit/ProcessScheduler.hxx +++ b/Kernel/KernelKit/ProcessScheduler.hxx @@ -266,7 +266,7 @@ namespace Kernel SizeT Run() noexcept; public: - STATIC Ref The(); + STATIC Ref& The(); private: ProcessTeam mTeam; diff --git a/Kernel/KernelKit/SMPManager.hpp b/Kernel/KernelKit/SMPManager.hpp index 69c8b54e..cb6b7884 100644 --- a/Kernel/KernelKit/SMPManager.hpp +++ b/Kernel/KernelKit/SMPManager.hpp @@ -9,7 +9,7 @@ #include #include -#include +#include // Last Rev // Sat Feb 24 CET 2024 diff --git a/Kernel/Modules/ACPI/ACPIFactoryInterface.hxx b/Kernel/Modules/ACPI/ACPIFactoryInterface.hxx index 6beb12a9..2977ff2e 100644 --- a/Kernel/Modules/ACPI/ACPIFactoryInterface.hxx +++ b/Kernel/Modules/ACPI/ACPIFactoryInterface.hxx @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace Kernel { diff --git a/Kernel/NetworkKit/IP.hpp b/Kernel/NetworkKit/IP.hpp index 5e29cc1f..80c4ba54 100644 --- a/Kernel/NetworkKit/IP.hpp +++ b/Kernel/NetworkKit/IP.hpp @@ -8,7 +8,7 @@ #include #include -#include +#include #include namespace Kernel diff --git a/Kernel/NewKit/ErrorOr.hpp b/Kernel/NewKit/ErrorOr.hpp index a528de57..7e261abf 100644 --- a/Kernel/NewKit/ErrorOr.hpp +++ b/Kernel/NewKit/ErrorOr.hpp @@ -10,7 +10,7 @@ #pragma once #include -#include +#include namespace Kernel { diff --git a/Kernel/NewKit/NewKit.hpp b/Kernel/NewKit/NewKit.hpp index 761a0411..144a0ea9 100644 --- a/Kernel/NewKit/NewKit.hpp +++ b/Kernel/NewKit/NewKit.hpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Kernel/NewKit/OwnPtr.hpp b/Kernel/NewKit/OwnPtr.hpp index 7aa2a247..6157a1b6 100644 --- a/Kernel/NewKit/OwnPtr.hpp +++ b/Kernel/NewKit/OwnPtr.hpp @@ -9,7 +9,7 @@ #include #include -#include +#include namespace Kernel { diff --git a/Kernel/NewKit/PageManager.hpp b/Kernel/NewKit/PageManager.hpp index 89c449f7..57b842ba 100644 --- a/Kernel/NewKit/PageManager.hpp +++ b/Kernel/NewKit/PageManager.hpp @@ -11,7 +11,7 @@ #include #include -#include +#include #ifndef kBadAddress #define kBadAddress (0) diff --git a/Kernel/NewKit/Pmm.hpp b/Kernel/NewKit/Pmm.hpp index 8c918de4..46db1879 100644 --- a/Kernel/NewKit/Pmm.hpp +++ b/Kernel/NewKit/Pmm.hpp @@ -8,7 +8,7 @@ #pragma once #include -#include +#include namespace Kernel { diff --git a/Kernel/NewKit/Ref.hpp b/Kernel/NewKit/Ref.hpp deleted file mode 100644 index 0b0f89cc..00000000 --- a/Kernel/NewKit/Ref.hpp +++ /dev/null @@ -1,98 +0,0 @@ - -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#ifndef _NEWKIT_REF_HPP_ -#define _NEWKIT_REF_HPP_ - -#include -#include - -namespace Kernel -{ - template - class Ref final - { - public: - Ref() = default; - ~Ref() = default; - - public: - Ref(T cls, const bool& strong = false) - : fClass(cls), fStrong(strong) - { - } - - Ref& operator=(T ref) - { - fClass = ref; - return *this; - } - - public: - T operator->() const - { - return fClass; - } - - T& Leak() noexcept - { - return fClass; - } - - T& Fetch() const noexcept - { - return fClass; - } - - T operator*() - { - return fClass; - } - - bool IsStrong() const - { - return fStrong; - } - - operator bool() noexcept - { - return fStrong; - } - - private: - T fClass; - bool fStrong{false}; - }; - - template - class NonNullRef final - { - public: - NonNullRef() = delete; - NonNullRef(nullPtr) = delete; - - NonNullRef(T* ref) - : fRef(ref, true) - { - MUST_PASS(ref != nullptr); - } - - Ref& operator->() - { - MUST_PASS(fRef); - return fRef; - } - - NonNullRef& operator=(const NonNullRef& ref) = delete; - NonNullRef(const NonNullRef& ref) = default; - - private: - Ref fRef{nullptr}; - }; -} // namespace Kernel - -#endif // ifndef _NEWKIT_REF_HPP_ diff --git a/Kernel/NewKit/Ref.hxx b/Kernel/NewKit/Ref.hxx new file mode 100644 index 00000000..69150054 --- /dev/null +++ b/Kernel/NewKit/Ref.hxx @@ -0,0 +1,106 @@ + +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#ifndef _NEWKIT_REF_HPP_ +#define _NEWKIT_REF_HPP_ + +#include +#include + +namespace Kernel +{ + template + class Ref final + { + public: + Ref() = default; + + ~Ref() + { + if (fStrong) + { + fClass = nullptr; + } + } + + public: + Ref(T cls, const bool& strong = false) + : fClass(&cls), fStrong(strong) + { + } + + Ref& operator=(T ref) + { + *fClass = ref; + return *this; + } + + public: + T operator->() const + { + return *fClass; + } + + T& Leak() noexcept + { + return *fClass; + } + + T& TryLeak() const noexcept + { + MUST_PASS(*fClass); + return *fClass; + } + + T operator*() + { + return *fClass; + } + + bool IsStrong() const + { + return fStrong; + } + + operator bool() noexcept + { + return fStrong; + } + + private: + T* fClass; + Bool fStrong{false}; + }; + + template + class NonNullRef final + { + public: + NonNullRef() = delete; + NonNullRef(nullPtr) = delete; + + NonNullRef(T* ref) + : fRef(ref, true) + { + MUST_PASS(ref != nullptr); + } + + Ref& operator->() + { + MUST_PASS(fRef); + return fRef; + } + + NonNullRef& operator=(const NonNullRef& ref) = delete; + NonNullRef(const NonNullRef& ref) = default; + + private: + Ref fRef{nullptr}; + }; +} // namespace Kernel + +#endif // ifndef _NEWKIT_REF_HPP_ diff --git a/Kernel/NewKit/Stream.hpp b/Kernel/NewKit/Stream.hpp index b615dc77..eefb0a1c 100644 --- a/Kernel/NewKit/Stream.hpp +++ b/Kernel/NewKit/Stream.hpp @@ -8,7 +8,7 @@ #pragma once #include -#include +#include namespace Kernel { diff --git a/Kernel/Sources/GUIDWizard.cxx b/Kernel/Sources/GUIDWizard.cxx index be7ad627..71488096 100644 --- a/Kernel/Sources/GUIDWizard.cxx +++ b/Kernel/Sources/GUIDWizard.cxx @@ -10,7 +10,7 @@ ------------------------------------------- */ #include -#include +#include // begin of ascii 'readable' characters. (A, C, C, 1, 2) #define kAsciiBegin 47 diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 34bc321d..b3e79c97 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -301,12 +301,14 @@ namespace Kernel return mTeam; } + /// @internal + STATIC Ref cSchedulerRef; + /// @brief Shared instance of the process scheduler. /// @return - Ref ProcessScheduler::The() + Ref& ProcessScheduler::The() { - static ProcessScheduler ref; - return {ref}; + return cSchedulerRef; } /// @brief Gets current running process. diff --git a/Kernel/Sources/Ref.cxx b/Kernel/Sources/Ref.cxx index d9eb039a..b92ceac4 100644 --- a/Kernel/Sources/Ref.cxx +++ b/Kernel/Sources/Ref.cxx @@ -4,4 +4,4 @@ ------------------------------------------- */ -#include +#include diff --git a/Kernel/StorageKit/PRDT.hpp b/Kernel/StorageKit/PRDT.hpp index 62dbfb5a..daf465d4 100644 --- a/Kernel/StorageKit/PRDT.hpp +++ b/Kernel/StorageKit/PRDT.hpp @@ -8,7 +8,7 @@ #include #include -#include +#include #define kPrdtTransferSize (sizeof(Kernel::UShort)) -- cgit v1.2.3