23 #ifndef MXNET_COMMON_OBJECT_POOL_H_ 24 #define MXNET_COMMON_OBJECT_POOL_H_ 25 #include <dmlc/logging.h> 47 template <
typename... Args>
48 T*
New(Args&&... args);
76 LinkedList* next{
nullptr};
80 LinkedList* next{
nullptr};
89 constexpr
static std::size_t kPageSize = 1 << 12;
95 LinkedList* head_{
nullptr};
99 std::vector<void*> allocated_;
109 void AllocateChunk();
116 template <
typename T>
122 template <
typename... Args>
123 static T*
New(Args&&... args);
130 static void Delete(T* ptr);
133 template <
typename T>
141 template <
typename T>
142 template <
typename... Args>
146 std::lock_guard<std::mutex> lock{m_};
147 if (head_->next ==
nullptr) {
153 return new (
static_cast<void*
>(ret)) T(std::forward<Args>(args)...);
156 template <
typename T>
159 auto linked_list_ptr =
reinterpret_cast<LinkedList*
>(ptr);
161 std::lock_guard<std::mutex> lock{m_};
162 linked_list_ptr->next = head_;
163 head_ = linked_list_ptr;
167 template <
typename T>
172 template <
typename T>
174 static std::shared_ptr<ObjectPool<T> > inst_ptr(
new ObjectPool<T>());
178 template <
typename T>
183 template <
typename T>
185 static_assert(
sizeof(LinkedList) <= kPageSize,
"Object too big.");
186 static_assert(
sizeof(LinkedList) %
alignof(LinkedList) == 0,
"ObjectPooll Invariant");
187 static_assert(
alignof(LinkedList) %
alignof(T) == 0,
"ObjectPooll Invariant");
188 static_assert(kPageSize %
alignof(LinkedList) == 0,
"ObjectPooll Invariant");
191 new_chunk_ptr = _aligned_malloc(kPageSize, kPageSize);
192 CHECK(new_chunk_ptr != NULL) <<
"Allocation failed";
194 int ret = posix_memalign(&new_chunk_ptr, kPageSize, kPageSize);
195 CHECK_EQ(ret, 0) <<
"Allocation failed";
197 allocated_.emplace_back(new_chunk_ptr);
198 auto new_chunk =
static_cast<LinkedList*
>(new_chunk_ptr);
199 auto size = kPageSize /
sizeof(LinkedList);
200 for (std::size_t i = 0; i < size - 1; ++i) {
201 new_chunk[i].next = &new_chunk[i + 1];
203 new_chunk[size - 1].next = head_;
207 template <
typename T>
208 template <
typename... Args>
213 template <
typename T>
220 #endif // MXNET_COMMON_OBJECT_POOL_H_ static void Delete(T *ptr)
Delete an existing object.
Definition: object_pool.h:214
static T * New(Args &&...args)
Create new object.
Definition: object_pool.h:209
namespace of mxnet
Definition: base.h:118
T * New(Args &&...args)
Create new object.
Definition: object_pool.h:143
static ObjectPool * Get()
Get singleton instance of pool.
Definition: object_pool.h:168
static std::shared_ptr< ObjectPool > _GetSharedRef()
Get a shared ptr of the singleton instance of pool.
Definition: object_pool.h:173
void Delete(T *ptr)
Delete an existing object.
Definition: object_pool.h:157
Helper trait class for easy allocation and deallocation.
Definition: object_pool.h:117
~ObjectPool()
Destructor.
Definition: object_pool.h:134
Object pool for fast allocation and deallocation.
Definition: object_pool.h:37