summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-05-29 10:36:11 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-05-29 10:36:11 +0200
commit385210cacb86008a65d060a5d21b9a2451e9c076 (patch)
treeab179489ac35784fb008969cc20a6f82756ed353
parent3a24657f3602bf5a6a9ec0dc8e208b68cea76a2a (diff)
fix: Fix Ref class, which caused memory leaks on the kernel.0.0.2e3
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
-rw-r--r--dev/kernel/DmaKit/DmaPool.h18
-rw-r--r--dev/kernel/NeKit/Ref.h4
2 files changed, 15 insertions, 7 deletions
diff --git a/dev/kernel/DmaKit/DmaPool.h b/dev/kernel/DmaKit/DmaPool.h
index d15346b8..ec98745d 100644
--- a/dev/kernel/DmaKit/DmaPool.h
+++ b/dev/kernel/DmaKit/DmaPool.h
@@ -38,14 +38,14 @@ inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) {
addr = (addr + (align - 1)) & ~(align - 1);
if ((addr + size) >= reinterpret_cast<UIntPtr>(kDmaPoolEnd)) {
- kout << "DMA Pool is exhausted!\r";
-
err_global_get() = kErrorDmaExhausted;
-
return nullptr;
}
kDmaPoolPtr = (UInt8*) (addr + size);
+
+ HAL::mm_memory_fence((VoidPtr)addr);
+
return (VoidPtr) addr;
}
@@ -55,7 +55,16 @@ inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) {
inline Void rtl_dma_free(SizeT size) {
if (!size) return;
- kDmaPoolPtr = (UInt8*) (kDmaPoolPtr - size);
+ auto ptr = (UInt8*) (kDmaPoolPtr - size);
+
+ if (!ptr || ptr < (UInt8*) kNeDMAPoolStart) {
+ err_global_get() = kErrorDmaExhausted;
+ return;
+ }
+
+ kDmaPoolPtr = ptr;
+
+ HAL::mm_memory_fence(ptr);
}
/***********************************************************************************/
@@ -67,6 +76,7 @@ inline Void rtl_dma_flush(VoidPtr ptr, SizeT size_buffer) {
}
if (!ptr || ptr < (UInt8*) kNeDMAPoolStart) {
+ err_global_get() = kErrorDmaExhausted;
return;
}
diff --git a/dev/kernel/NeKit/Ref.h b/dev/kernel/NeKit/Ref.h
index 80494ab8..9920aa6f 100644
--- a/dev/kernel/NeKit/Ref.h
+++ b/dev/kernel/NeKit/Ref.h
@@ -25,11 +25,9 @@ class Ref final {
public:
Ref(T* cls) : fClass(cls) {}
- Ref(T cls) : fClass(nullptr) { fClass = new T(cls); }
+ Ref(T cls) : fClass(nullptr) { fClass = &cls; }
Ref& operator=(T ref) {
- if (!fClass) return *this;
-
fClass = &ref;
return *this;
}