From c258c2e5fa9f5134dbc56f717ba37231a08a9081 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 16 Dec 2025 10:05:50 +0100 Subject: chore: kernel improvements and tweaks on the kernel. - Two default domains: - Computable domain, alias: Domain. - Non-Computable domain, alias: NullDomain. - DiskSwap API improvements. - Vettable Now returns the Result object instead of its value. - Kernel shall not panic when `ptr_new` returns null. Signed-off-by: Amlal El Mahrouss --- src/kernel/NeKit/Domain.h | 37 +++++++++++++++++++++++++++++++++++++ src/kernel/NeKit/Function.h | 2 -- src/kernel/NeKit/Nullable.h | 32 -------------------------------- src/kernel/NeKit/Ref.h | 2 +- src/kernel/NeKit/TOML.h | 2 ++ src/kernel/NeKit/Variant.h | 6 +----- src/kernel/NeKit/Vettable.h | 8 ++++---- src/kernel/SwapKit/DiskSwap.h | 22 +++++++++++----------- src/kernel/src/BitMapMgr.cc | 10 ++-------- src/kernel/src/Swap/DiskSwap.cc | 19 +++++++------------ 10 files changed, 65 insertions(+), 75 deletions(-) create mode 100644 src/kernel/NeKit/Domain.h delete mode 100644 src/kernel/NeKit/Nullable.h diff --git a/src/kernel/NeKit/Domain.h b/src/kernel/NeKit/Domain.h new file mode 100644 index 00000000..cda63ee9 --- /dev/null +++ b/src/kernel/NeKit/Domain.h @@ -0,0 +1,37 @@ +/* ======================================== + + Copyright (C) 2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. + +======================================== */ + +#ifndef __NE_KIT_DOMAIN_H__ +#define __NE_KIT_DOMAIN_H__ + +#include + +namespace Kernel { +template +struct IsDefined final { + using ResultType = Type; + using ResultTypeRef = Type&; + + static constexpr bool kValue = true; +}; + +template <> +struct IsDefined final { + static constexpr bool kValue = false; +}; + +using NullDomain = IsDefined; + +template +using Domain = IsDefined; + +template +concept IsAcceptable = requires() { + { IsDefined::kValue }; +}; +} // namespace Kernel + +#endif // !__NE_KIT_DOMAIN_H__ \ No newline at end of file diff --git a/src/kernel/NeKit/Function.h b/src/kernel/NeKit/Function.h index f7e47973..dfa8608a 100644 --- a/src/kernel/NeKit/Function.h +++ b/src/kernel/NeKit/Function.h @@ -27,8 +27,6 @@ class Function final { T operator()(Args&&... args) { return fFn(args...); } - T Call(Args&&... args) { return fFn(args...); } - explicit operator bool() { return fFn; } bool operator!() { return !fFn; } diff --git a/src/kernel/NeKit/Nullable.h b/src/kernel/NeKit/Nullable.h deleted file mode 100644 index 30ce9da4..00000000 --- a/src/kernel/NeKit/Nullable.h +++ /dev/null @@ -1,32 +0,0 @@ -/* ======================================== - - Copyright (C) 2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. - -======================================== */ - -#ifndef __NE_KIT_NULLABLE_H__ -#define __NE_KIT_NULLABLE_H__ - -#include - -namespace Kernel { -template -struct IsDefined final { - using ResultType = Type; - using ResultTypeRef = Type&; - - static constexpr bool kValue = true; -}; - -template <> -struct IsDefined final { - static constexpr bool kValue = false; -}; - -template -concept IsAcceptable = requires() { - { IsDefined::kValue }; -}; -} // namespace Kernel - -#endif // !__NE_KIT_NULLABLE_H__ \ No newline at end of file diff --git a/src/kernel/NeKit/Ref.h b/src/kernel/NeKit/Ref.h index 62460568..4767f728 100644 --- a/src/kernel/NeKit/Ref.h +++ b/src/kernel/NeKit/Ref.h @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include namespace Kernel { diff --git a/src/kernel/NeKit/TOML.h b/src/kernel/NeKit/TOML.h index dee273ad..3eaf5197 100644 --- a/src/kernel/NeKit/TOML.h +++ b/src/kernel/NeKit/TOML.h @@ -6,6 +6,8 @@ #pragma once +#include + namespace Kernel { class TOMLObject final { public: diff --git a/src/kernel/NeKit/Variant.h b/src/kernel/NeKit/Variant.h index f7b2c450..5747e9ca 100644 --- a/src/kernel/NeKit/Variant.h +++ b/src/kernel/NeKit/Variant.h @@ -40,13 +40,9 @@ class Variant final { : fPtr((VoidPtr) stringView), fKind(VariantKind::kString) {} explicit Variant(JsonObject<>* json) : fPtr((VoidPtr) json), fKind(VariantKind::kJson) {} - explicit Variant(TOMLObject* toml) : fPtr((VoidPtr) toml), fKind(VariantKind::kTOML) {} - explicit Variant(nullPtr ptr) : fPtr(ptr), fKind(VariantKind::kNull) {} - - explicit Variant(SWAP_DISK_HEADER* ptr) : fPtr(ptr), fKind(VariantKind::kSwap) {} - + explicit Variant(SwapDiskHdr* ptr) : fPtr(ptr), fKind(VariantKind::kSwap) {} explicit Variant(VoidPtr ptr) : fPtr(ptr), fKind(VariantKind::kBlob) {} public: diff --git a/src/kernel/NeKit/Vettable.h b/src/kernel/NeKit/Vettable.h index fad1f06c..d79aaa0b 100644 --- a/src/kernel/NeKit/Vettable.h +++ b/src/kernel/NeKit/Vettable.h @@ -39,12 +39,12 @@ struct Vettable final { static constexpr bool kValue = true; }; -using FallbackType = bool (*)(bool type_value); +template +using FallbackType = Void (*)(const PropertyResult& type_value); -/// @brief Concept version of Vettable. -template +template OnFallback> concept IsVettable = requires() { - { Vettable::kValue ? TrueResult::kValue : OnFallback(PropertyResult::kValue) }; + { Vettable::kValue ? TrueResult{} : OnFallback(PropertyResult{}) }; }; } // namespace Kernel diff --git a/src/kernel/SwapKit/DiskSwap.h b/src/kernel/SwapKit/DiskSwap.h index 7b3cb0f1..c3297c66 100644 --- a/src/kernel/SwapKit/DiskSwap.h +++ b/src/kernel/SwapKit/DiskSwap.h @@ -18,19 +18,19 @@ /// @brief Virtual memory swap disk. namespace Kernel { -struct SWAP_DISK_HEADER; -class DiskSwapInterface; +struct SwapDiskHdr; +class IDiskSwap; /// @brief Virtual memory interface to swap memory chunks onto disk. /// @note The class only supports the NeFS as of right now, as it is using forks to write data into /// disk. -class DiskSwapInterface final { +class IDiskSwap final { public: - explicit DiskSwapInterface() = default; - ~DiskSwapInterface() = default; + explicit IDiskSwap() = default; + ~IDiskSwap() = default; - NE_COPY_DELETE(DiskSwapInterface) - NE_MOVE_DELETE(DiskSwapInterface) + NE_COPY_DELETE(IDiskSwap) + NE_MOVE_DELETE(IDiskSwap) public: /***********************************************************************************/ @@ -40,7 +40,7 @@ class DiskSwapInterface final { /// @param data the data packet. /// @return Whether the swap was written to disk, or not. /***********************************************************************************/ - BOOL Write(const Char* name, SizeT name_len, SWAP_DISK_HEADER* data); + BOOL Write(const Char* name, SizeT name_len, SwapDiskHdr* data); /***********************************************************************************/ /// @brief Read memory chunk from disk. @@ -49,7 +49,7 @@ class DiskSwapInterface final { /// @param data the data packet length. /// @return Whether the swap was fetched to disk, or not. /***********************************************************************************/ - _Output SWAP_DISK_HEADER* Read(const Char* name, SizeT name_len, SizeT data_len); + _Output SwapDiskHdr* Read(const Char* name, SizeT name_len, SizeT data_len); }; /// @brief Swap disk header, containing information about the held virtual memory. @@ -60,7 +60,7 @@ class DiskSwapInterface final { /// @param fVirtualAddress Virtual address pointed by data. /// @param fBlobSz Blob's size. /// @param fBlob Data blob. -typedef struct SWAP_DISK_HEADER { +typedef struct SwapDiskHdr { UInt32 fMagic; SizeT fHeaderSz; UInt64 fTeamID; @@ -68,5 +68,5 @@ typedef struct SWAP_DISK_HEADER { UInt64 fVirtualAddress; SizeT fBlobSz; UInt8 fBlob[1]; -} PACKED ALIGN(8) SWAP_DISK_HEADER; +} PACKED ALIGN(8) SwapDiskHdr; } // namespace Kernel diff --git a/src/kernel/src/BitMapMgr.cc b/src/kernel/src/BitMapMgr.cc index 98e34afe..ca124ee8 100644 --- a/src/kernel/src/BitMapMgr.cc +++ b/src/kernel/src/BitMapMgr.cc @@ -59,7 +59,7 @@ namespace HAL { return Yes; } - UInt32 MakeMMFlags(Bool wr, Bool user) { + UInt32 MakeMMFlags(const Bool& wr, const Bool& user) { UInt32 flags = kMMFlagsPresent; if (wr) flags |= kMMFlagsWr; @@ -87,7 +87,7 @@ namespace HAL { return nullptr; } - VoidPtr base = reinterpret_cast((UIntPtr) base_ptr); + VoidPtr base = reinterpret_cast(base_ptr); MUST_PASS(base); if (!base) return nullptr; @@ -183,12 +183,6 @@ namespace HAL { if (is_page) return nullptr; ptr_new = kBitMapMgr.FindBitMap(kKernelBitMpStart, size, wr, user, pad); - - if (!ptr_new) { - ke_panic(RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM, "Out of memory bitmap"); - return nullptr; - } - return ptr_new; } diff --git a/src/kernel/src/Swap/DiskSwap.cc b/src/kernel/src/Swap/DiskSwap.cc index f0fa5915..0f97eb4d 100644 --- a/src/kernel/src/Swap/DiskSwap.cc +++ b/src/kernel/src/Swap/DiskSwap.cc @@ -17,20 +17,17 @@ static constexpr UInt32 kSwapDiskHeaderMagic = 0x44535750; // 'DSWP' /// @param data the data packet. /// @return Whether the swap was written to disk, or not. /***********************************************************************************/ -BOOL DiskSwapInterface::Write(const Char* fork_name, SizeT fork_name_len, SWAP_DISK_HEADER* data) { +BOOL IDiskSwap::Write(const Char* fork_name, SizeT fork_name_len, SwapDiskHdr* data) { if (!fork_name || !fork_name_len) return NO; - if (*fork_name == 0) return NO; if (!data || data->fMagic != kSwapDiskHeaderMagic) return NO; FileStream file(kSwapPageFilePath, kRestrictWRB); - ErrorOr ret = file.Write(fork_name, data, sizeof(SWAP_DISK_HEADER) + data->fBlobSz); - - if (ret.Error()) return NO; + ErrorOr ret = file.Write(fork_name, data, sizeof(SwapDiskHdr) + data->fBlobSz); - return YES; + return ret.Value() < kErrorSuccess; } /***********************************************************************************/ @@ -40,25 +37,23 @@ BOOL DiskSwapInterface::Write(const Char* fork_name, SizeT fork_name_len, SWAP_D /// @param data the data packet length. /// @return Whether the swap was fetched to disk, or not. /***********************************************************************************/ -SWAP_DISK_HEADER* DiskSwapInterface::Read(const Char* fork_name, SizeT fork_name_len, +SwapDiskHdr* IDiskSwap::Read(const Char* fork_name, SizeT fork_name_len, SizeT data_len) { if (!fork_name || !fork_name_len) return nullptr; - if (*fork_name == 0) return nullptr; if (data_len > kSwapBlockMaxSize) return nullptr; - if (data_len == 0) return nullptr; FileStream file(kSwapPageFilePath, kRestrictRB); - VoidPtr blob = file.Read(fork_name, sizeof(SWAP_DISK_HEADER) + data_len); + VoidPtr blob = file.Read(fork_name, sizeof(SwapDiskHdr) + data_len); - if (!blob || ((SWAP_DISK_HEADER*) blob)->fMagic != kSwapDiskHeaderMagic) { + if (!blob || (static_cast(blob))->fMagic != kSwapDiskHeaderMagic) { if (blob) mm_free_ptr(blob); return nullptr; } - return reinterpret_cast(blob); + return reinterpret_cast(blob); } } // namespace Kernel -- cgit v1.2.3