summaryrefslogtreecommitdiffhomepage
path: root/dev/lib/memory/tracked_ptr.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'dev/lib/memory/tracked_ptr.hpp')
-rw-r--r--dev/lib/memory/tracked_ptr.hpp44
1 files changed, 28 insertions, 16 deletions
diff --git a/dev/lib/memory/tracked_ptr.hpp b/dev/lib/memory/tracked_ptr.hpp
index c767b67..d2f8450 100644
--- a/dev/lib/memory/tracked_ptr.hpp
+++ b/dev/lib/memory/tracked_ptr.hpp
@@ -1,22 +1,22 @@
/*
* File: memory/tracked_ptr.hpp
* Purpose: Custom smart pointer implementation in C++
- * Author: Amlal El Mahrouss (founder@snu.systems)
- * Copyright 2025, Amlal El Mahrouss and SNU Systems Corp.
+ * Author: Amlal El Mahrouss (amlal@nekernel.org)
+ * Copyright 2025, Amlal El Mahrouss
*/
#pragma once
#include <cstddef>
#include <utility>
-#include <memory>
+#include <new>
#include <atomic>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
-namespace snu::memory
+namespace ocl::memory
{
template <typename T>
class tracked_allocator;
@@ -45,19 +45,24 @@ namespace snu::memory
template <typename... U>
void retain(T*& ptr, U&&... args)
{
- ptr = new T(args...);
+ ptr = new T(std::forward<U>(args)...);
if (ptr)
{
++allocated_count_;
+ return;
}
- else
- {
- throw std::bad_alloc();
- }
+
+ throw std::bad_alloc();
+ }
+
+ template <typename... U>
+ void must_retain(T*& ptr, U&&... args) noexcept
+ {
+ this->retain(ptr, args...);
}
- void dispose(T*& ptr)
+ void dispose(T*& ptr) noexcept
{
if (ptr)
{
@@ -96,10 +101,17 @@ namespace snu::memory
{
T* ptr = nullptr;
allocator_.retain(ptr, std::forward<U>(args)...);
+
return ptr;
}
- void dispose(T*& ptr)
+ template <typename... U>
+ T* must_retain(U&&... args) noexcept
+ {
+ return this->retain(std::forward<U>(args)...);
+ }
+
+ void dispose(T*& ptr) noexcept
{
allocator_.dispose(ptr);
}
@@ -128,7 +140,7 @@ namespace snu::memory
this->reset();
}
- tracked_ptr(const tracked_ptr&) = delete;
+ tracked_ptr(const tracked_ptr&) = delete;
tracked_ptr& operator=(const tracked_ptr&) = delete;
public:
@@ -190,13 +202,13 @@ namespace snu::memory
}
private:
- T* ptr_ = nullptr;
+ T* ptr_{nullptr};
};
template <typename T>
- inline auto make_tracked(T arg) -> tracked_ptr<T>
+ inline auto make_tracked() -> tracked_ptr<T>
{
- return tracked_ptr<T>(std::forward<T>(arg));
+ return tracked_ptr<T>();
}
template <typename U, typename... T>
@@ -220,4 +232,4 @@ namespace snu::memory
::kill(::getpid(), SIGTRAP);
}
}
-} // namespace snu::memory \ No newline at end of file
+} // namespace ocl::memory