From b62e554e9763497e53bae0a3d5a895c1cdbf40de Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sat, 4 Jan 2025 22:42:12 +0100 Subject: Deallocate StatusInternal on drop --- asl/status.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'asl/status.cpp') diff --git a/asl/status.cpp b/asl/status.cpp index ac0b29e..eb26111 100644 --- a/asl/status.cpp +++ b/asl/status.cpp @@ -1,5 +1,7 @@ #include "asl/status.hpp" #include "asl/allocator.hpp" +#include "asl/string.hpp" +#include "asl/atomic.hpp" using Allocator = asl::DefaultAllocator; static Allocator g_allocator{}; @@ -9,8 +11,17 @@ namespace struct StatusInternal { - asl::string_view msg; + // @Todo Use custom allocator + asl::string<> msg; asl::status_code code; + asl::atomic ref_count; + + constexpr StatusInternal(asl::string_view msg_, asl::status_code code_) + : msg{msg_} + , code{code_} + { + atomic_store(&ref_count, 1); + } }; } // anonymous namespace @@ -25,3 +36,14 @@ asl::status_code asl::status::code_internal() const return reinterpret_cast(m_payload)->code; } +void asl::status::unref() +{ + ASL_ASSERT(!is_inline()); + auto* internal = reinterpret_cast(m_payload); + if (atomic_fetch_decrement(&internal->ref_count, memory_order::release) == 1) + { + atomic_fence(memory_order::acquire); + alloc_delete(g_allocator, internal); + } +} + -- cgit