@@ -58,25 +58,36 @@ namespace core {
5858class BaseShared {
5959 public:
6060 static void SetAllocateAndFree (
61- const std::function<void *(size_t , size_t , uint32_t , int )>& allocate ,
62- const std::function<void(void *)>& free ) {
63- allocate_ = allocate ;
64- free_ = free ;
61+ const std::function<void *(size_t , size_t , uint32_t , int )>& alloc ,
62+ const std::function<void(void *)>& fr ) {
63+ allocate_ () = alloc ;
64+ free_ () = fr ;
6565 }
6666
6767 protected:
68- static std::function<void *(size_t , size_t , uint32_t , int )> allocate_;
69- static std::function<void (void *)> free_;
68+ static __forceinline std::function<void *(size_t , size_t , uint32_t , int )>&
69+ allocate_ () {
70+ static std::function<void *(size_t , size_t , uint32_t , int )> alloc =
71+ nullptr ;
72+ return alloc;
73+ }
74+ static __forceinline std::function<void (void *)>&
75+ free_ () {
76+ static std::function<void (void *)> fr = nullptr ;
77+ return fr;
78+ }
79+
7080};
7181
7282// / @brief Default Allocator for Shared. Ensures allocations are whole pages.
7383template <typename T> class PageAllocator : private BaseShared {
7484 public:
7585 __forceinline static T* alloc (int flags = 0 ) {
76- T* ret = reinterpret_cast <T*>(allocate_ (AlignUp (sizeof (T), 4096 ), 4096 , flags, 0 ));
86+ T* ret = reinterpret_cast <T*>(
87+ allocate_ ()(AlignUp (sizeof (T), 4096 ), 4096 , flags, 0 ));
7788 if (ret == nullptr ) throw std::bad_alloc ();
7889
79- MAKE_NAMED_SCOPE_GUARD (throwGuard, [&]() { free_ (ret); });
90+ MAKE_NAMED_SCOPE_GUARD (throwGuard, [&]() { free_ ()( ret); });
8091
8192 new (ret) T;
8293
@@ -85,10 +96,11 @@ template <typename T> class PageAllocator : private BaseShared {
8596 }
8697
8798 __forceinline static T* alloc (int agent_node_id, int flags) {
88- T* ret = reinterpret_cast <T*>(allocate_ (AlignUp (sizeof (T), 4096 ), 4096 , flags, agent_node_id));
99+ T* ret = reinterpret_cast <T*>(
100+ allocate_ ()(AlignUp (sizeof (T), 4096 ), 4096 , flags, agent_node_id));
89101 if (ret == nullptr ) throw std::bad_alloc ();
90102
91- MAKE_NAMED_SCOPE_GUARD (throwGuard, [&]() { free_ (ret); });
103+ MAKE_NAMED_SCOPE_GUARD (throwGuard, [&]() { free_ ()( ret); });
92104
93105 new (ret) T;
94106
@@ -99,7 +111,7 @@ template <typename T> class PageAllocator : private BaseShared {
99111 __forceinline static void free (T* ptr) {
100112 if (ptr != nullptr ) {
101113 ptr->~T ();
102- free_ (ptr);
114+ free_ ()( ptr);
103115 }
104116 }
105117};
@@ -110,7 +122,7 @@ template <typename T, typename Allocator = PageAllocator<T>>
110122class Shared final : private BaseShared {
111123 public:
112124 explicit Shared (Allocator* pool = nullptr , int flags = 0 ) : pool_(pool) {
113- assert (allocate_ != nullptr && free_ != nullptr &&
125+ assert (allocate_ () != nullptr && free_ () != nullptr &&
114126 " Shared object allocator is not set" );
115127
116128 if (pool_)
@@ -120,7 +132,7 @@ class Shared final : private BaseShared {
120132 }
121133
122134 explicit Shared (int agent_node_id, Allocator* pool = nullptr , int flags = 0 ) : pool_(pool) {
123- assert (allocate_ != nullptr && free_ != nullptr &&
135+ assert (allocate_ () != nullptr && free_ () != nullptr &&
124136 " Shared object allocator is not set" );
125137
126138 if (pool_)
@@ -130,7 +142,8 @@ class Shared final : private BaseShared {
130142 }
131143
132144 ~Shared () {
133- assert (allocate_ != nullptr && free_ != nullptr && " Shared object allocator is not set" );
145+ assert (allocate_ () != nullptr && free_ () != nullptr &&
146+ " Shared object allocator is not set" );
134147
135148 if (pool_)
136149 pool_->free (shared_object_);
@@ -164,19 +177,20 @@ class Shared final : private BaseShared {
164177template <typename T> class Shared <T, PageAllocator<T>> final : private BaseShared {
165178 public:
166179 Shared (int flags = 0 ) {
167- assert (allocate_ != nullptr && free_ != nullptr && " Shared object allocator is not set" );
180+ assert (allocate_ () != nullptr && free_ () != nullptr &&
181+ " Shared object allocator is not set" );
168182
169183 shared_object_ = PageAllocator<T>::alloc (flags);
170184 }
171185
172186 Shared (int agent_node_id, int flags) {
173- assert (allocate_ != nullptr && free_ != nullptr && " Shared object allocator is not set" );
187+ assert (allocate_ () != nullptr && free_ () != nullptr && " Shared object allocator is not set" );
174188
175189 shared_object_ = PageAllocator<T>::alloc (agent_node_id, flags);
176190 }
177191
178192 ~Shared () {
179- assert (allocate_ != nullptr && free_ != nullptr &&
193+ assert (allocate_ () != nullptr && free_ () != nullptr &&
180194 " Shared object allocator is not set" );
181195
182196 PageAllocator<T>::free (shared_object_);
@@ -207,18 +221,19 @@ template <typename T, size_t Align> class SharedArray final : private BaseShared
207221 SharedArray () : shared_object_(nullptr ) {}
208222
209223 explicit SharedArray (size_t length) : shared_object_(nullptr ), len(length) {
210- assert (allocate_ != nullptr && free_ != nullptr && " Shared object allocator is not set" );
224+ assert (allocate_ () != nullptr && free_ () != nullptr &&
225+ " Shared object allocator is not set" );
211226 static_assert ((__alignof (T) <= Align) || (Align == 0 ), " Align is less than alignof(T)" );
212227
213228 shared_object_ =
214- reinterpret_cast <T*>(allocate_ (sizeof (T) * length, Max (__alignof (T), Align), 0 , 0 ));
229+ reinterpret_cast <T*>(allocate_ ()( sizeof (T) * length, Max (__alignof (T), Align), 0 , 0 ));
215230 if (shared_object_ == nullptr ) throw std::bad_alloc ();
216231
217232 size_t i = 0 ;
218233
219234 MAKE_NAMED_SCOPE_GUARD (loopGuard, [&]() {
220235 for (size_t t = 0 ; t < i - 1 ; t++) shared_object_[t].~T ();
221- free_ (shared_object_);
236+ free_ ()( shared_object_);
222237 });
223238
224239 for (; i < length; i++) new (&shared_object_[i]) T;
@@ -227,11 +242,12 @@ template <typename T, size_t Align> class SharedArray final : private BaseShared
227242 }
228243
229244 ~SharedArray () {
230- assert (allocate_ != nullptr && free_ != nullptr && " Shared object allocator is not set" );
245+ assert (allocate_ () != nullptr && free_ () != nullptr &&
246+ " Shared object allocator is not set" );
231247
232248 if (shared_object_ != nullptr ) {
233249 for (size_t i = 0 ; i < len; i++) shared_object_[i].~T ();
234- free_ (shared_object_);
250+ free_ ()( shared_object_);
235251 }
236252 }
237253
0 commit comments