26 struct alignas(2 * sizeof(Node*))
PTag
31 struct alignas(2 * sizeof(Node*))
Node
45 PTag old_head =
mHead.load(std::memory_order_relaxed);
52 if (
mHead.compare_exchange_weak(old_head, new_head, std::memory_order_acquire,
53 std::memory_order_relaxed))
62 PTag old_head =
mHead.load(std::memory_order_relaxed);
65 node->
next = old_head.
p;
66 PTag new_head{node, old_head.
tag + 1};
67 if (
mHead.compare_exchange_weak(old_head, new_head, std::memory_order_acquire,
68 std::memory_order_relaxed))
81 for (
size_t i = 0; i + 1 <
mSize; i++)
92 template <
typename... Args>
99 std::construct_at(&node->
data, std::forward<Args>(args)...);
111 Node* node =
reinterpret_cast<Node*
>(
reinterpret_cast<uintptr_t
>(ptr) - offsetof(
Node, data));
112 uintptr_t old_used =
true;
113 if (node->
used.compare_exchange_strong(old_used,
false, std::memory_order_acquire, std::memory_order_relaxed))
125 Node* node =
reinterpret_cast<Node*
>(
reinterpret_cast<uintptr_t
>(ptr) - offsetof(
Node, data));
126 return static_cast<size_t>(node -
mNodes);
143 for (
size_t i = 0; i <
mSize; i++)
158 template <
typename T>
179 template <
typename... Args>
182 std::unique_lock lock(
mMutex);
183 return &
mObjects.emplace_back(std::forward<Args>(args)...);
196 std::unique_lock lock(
mMutex);
201 removed.splice(removed.end(),
mObjects, it);
215 std::unique_lock lock(
mMutex);
216 removed.splice(removed.end(),
mObjects);
220 [[nodiscard]]
size_t Size()
const
222 std::unique_lock lock(
mMutex);
Allocator interface (noexcept)
Definition Allocator.hpp:29
Atomic, bounded object pool of fixed allocation sizes. Being a sibling to AtomicStack - key differenc...
Definition AtomicPool.hpp:24
Atomic< PTag > mHead
Definition AtomicPool.hpp:40
Node * mNodes
Definition AtomicPool.hpp:38
ScopedArena mArena
Definition AtomicPool.hpp:41
void Destruct(T *ptr)
Destructs the object pointed to by ptr and returns it to the pool.
Definition AtomicPool.hpp:105
~AtomicPool()
Definition AtomicPool.hpp:147
size_t mSize
Definition AtomicPool.hpp:39
T * At(size_t index)
Returns the pointer at the given index in the pool.
Definition AtomicPool.hpp:132
size_t Index(T *ptr) const
Returns the index of the given pointer in the pool.
Definition AtomicPool.hpp:123
T * Construct(Args &&... args)
Constructs an object of type T in the pool with the given arguments.
Definition AtomicPool.hpp:93
void Collect()
Destruct all allocated objects in the pool, collecting garbage.
Definition AtomicPool.hpp:141
AtomicPool(size_t size, Allocator *alloc)
Definition AtomicPool.hpp:77
void DeallocateNode(Node *node)
Definition AtomicPool.hpp:60
Node * AllocateNode()
Definition AtomicPool.hpp:43
Mutex-protected, dynamically sized object pool with stable object pointers.
Definition AtomicPool.hpp:160
DynamicPool(DynamicPool &&)=delete
DynamicPool(Allocator *alloc)
Definition AtomicPool.hpp:166
~DynamicPool()
Definition AtomicPool.hpp:226
List< T > mObjects
Definition AtomicPool.hpp:162
DynamicPool(DynamicPool const &)=delete
T * Construct(Args &&... args)
Constructs an object of type T in the pool with the given arguments.
Definition AtomicPool.hpp:180
DynamicPool & operator=(DynamicPool &&)=delete
DynamicPool & operator=(DynamicPool const &)=delete
Allocator * mAllocator
Definition AtomicPool.hpp:161
Mutex mMutex
Definition AtomicPool.hpp:163
size_t Size() const
Definition AtomicPool.hpp:220
void Destruct(T *ptr)
Destructs the object pointed to by ptr and releases its storage.
Definition AtomicPool.hpp:189
void Collect()
Destructs all allocated objects in the pool.
Definition AtomicPool.hpp:211
Lock-free atomic primitives and implementations of data structures.
Definition Allocator.hpp:6
std::mutex Mutex
Definition Thread.hpp:10
std::list< T, StlAllocator< T > > List
std::list with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:231
std::atomic< T > Atomic
Alias of std::atomic<T>.
Definition Atomic.hpp:26
size_type size
Definition Allocator.hpp:23
pointer memory
Definition Allocator.hpp:22
Definition AtomicPool.hpp:32
Atomic< uintptr_t > used
Definition AtomicPool.hpp:34
Node * next
Definition AtomicPool.hpp:33
T data
Definition AtomicPool.hpp:35
Definition AtomicPool.hpp:27
Node * p
Definition AtomicPool.hpp:28
uintptr_t tag
Definition AtomicPool.hpp:29
RAII wrapper for an arena allocated from an Allocator.
Definition Allocator.hpp:49
Arena arena
Definition Allocator.hpp:51