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:127
 
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