From 835a1e3c771818e6f95b16ea9432af71159dc919 Mon Sep 17 00:00:00 2001 From: rahulsutariya Date: Thu, 9 Jul 2026 14:29:11 +0530 Subject: [PATCH] Add bounded lock-free allocation using atomic bump pointer - Replace InterprocessMutex protection with compare_exchange_weak - Limit CAS attempts to 32 for deterministic execution - Handle allocation failure after retry exhaustion Issue: https://github.com/eclipse-score/baselibs/issues/348 --- score/memory/shared/BUILD | 2 + .../memory/shared/shared_memory_resource.cpp | 109 +++++++++++++----- score/memory/shared/shared_memory_resource.h | 6 +- .../shared_memory_resource_allocate_test.cpp | 45 ++++++++ .../shared/shared_memory_test_resources.cpp | 7 ++ .../shared/shared_memory_test_resources.h | 2 + 6 files changed, 139 insertions(+), 32 deletions(-) diff --git a/score/memory/shared/BUILD b/score/memory/shared/BUILD index f739bdb0d1..44acf8e38c 100644 --- a/score/memory/shared/BUILD +++ b/score/memory/shared/BUILD @@ -131,6 +131,7 @@ cc_library( "@score_baselibs//score/memory/shared/fake:__subpackages__", ], deps = [ + ":atomic_indirector", ":i_shared_memory_resource", ":lock_file", ":pointer_arithmetic_util", @@ -786,6 +787,7 @@ cc_gtest_unit_test( "@score_baselibs//score/memory:__pkg__", ], deps = [ + ":atomic_indirector_mock_binding", ":pointer_arithmetic_util", ":shared_memory_test_resources", "@score_baselibs//score/memory/shared/fake:fake_memory_resources", diff --git a/score/memory/shared/shared_memory_resource.cpp b/score/memory/shared/shared_memory_resource.cpp index 0cc2c44477..82c2c4621e 100644 --- a/score/memory/shared/shared_memory_resource.cpp +++ b/score/memory/shared/shared_memory_resource.cpp @@ -12,6 +12,7 @@ ********************************************************************************/ #include "score/memory/shared/shared_memory_resource.h" #include "score/language/safecpp/string_view/zstring_view.h" +#include "score/memory/shared/atomic_indirector.h" #include "score/memory/shared/memory_resource_proxy.h" #include "score/memory/shared/memory_resource_registry.h" #include "score/memory/shared/pointer_arithmetic_util.h" @@ -688,51 +689,101 @@ auto SharedMemoryResource::getMemoryResourceProxy() noexcept -> const MemoryReso auto SharedMemoryResource::do_allocate(const std::size_t bytes, const std::size_t alignment) -> void* { - std::lock_guard lock(this->control_block_->mutex); + return do_allocate_with_indirector(bytes, alignment); +} + +template