Vowpal Wabbit
Public Member Functions | Private Member Functions | Private Attributes | List of all members
VW::no_lock_object_pool< T, TInitializer, TCleanup > Struct Template Reference

#include <object_pool.h>

Public Member Functions

 no_lock_object_pool ()=default
 
 no_lock_object_pool (size_t initial_chunk_size, TInitializer initializer={}, size_t chunk_size=8)
 
 ~no_lock_object_pool ()
 
void return_object (T *obj)
 
T * get_object ()
 
bool empty () const
 
size_t size () const
 
bool is_from_pool (T *obj) const
 

Private Member Functions

void new_chunk (size_t size)
 

Private Attributes

std::queue< T * > m_pool
 
std::vector< std::pair< T *, T * > > m_chunk_bounds
 
std::vector< std::unique_ptr< T[]> > m_chunks
 
TInitializer m_initializer
 
TCleanup m_cleanup
 
size_t m_initial_chunk_size = 0
 
size_t m_chunk_size = 8
 

Detailed Description

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
struct VW::no_lock_object_pool< T, TInitializer, TCleanup >

Definition at line 30 of file object_pool.h.

Constructor & Destructor Documentation

◆ no_lock_object_pool() [1/2]

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
VW::no_lock_object_pool< T, TInitializer, TCleanup >::no_lock_object_pool ( )
default

◆ no_lock_object_pool() [2/2]

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
VW::no_lock_object_pool< T, TInitializer, TCleanup >::no_lock_object_pool ( size_t  initial_chunk_size,
TInitializer  initializer = {},
size_t  chunk_size = 8 
)
inline

Definition at line 33 of file object_pool.h.

33  {}, size_t chunk_size = 8)
34  : m_initializer(initializer), m_initial_chunk_size(initial_chunk_size), m_chunk_size(chunk_size)
35  {
36  new_chunk(initial_chunk_size);
37  }
TInitializer m_initializer
Definition: object_pool.h:120
void new_chunk(size_t size)
Definition: object_pool.h:98

◆ ~no_lock_object_pool()

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
VW::no_lock_object_pool< T, TInitializer, TCleanup >::~no_lock_object_pool ( )
inline

Definition at line 39 of file object_pool.h.

40  {
41  while (!m_pool.empty())
42  {
43  auto front = m_pool.front();
44  m_cleanup(front);
45  m_pool.pop();
46  }
47  }
std::queue< T * > m_pool
Definition: object_pool.h:117

Member Function Documentation

◆ empty()

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
bool VW::no_lock_object_pool< T, TInitializer, TCleanup >::empty ( ) const
inline

Definition at line 67 of file object_pool.h.

67 { return m_pool.empty(); }
std::queue< T * > m_pool
Definition: object_pool.h:117

◆ get_object()

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
T* VW::no_lock_object_pool< T, TInitializer, TCleanup >::get_object ( )
inline

Definition at line 55 of file object_pool.h.

56  {
57  if (m_pool.empty())
58  {
60  }
61 
62  auto obj = m_pool.front();
63  m_pool.pop();
64  return obj;
65  }
void new_chunk(size_t size)
Definition: object_pool.h:98
std::queue< T * > m_pool
Definition: object_pool.h:117

◆ is_from_pool()

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
bool VW::no_lock_object_pool< T, TInitializer, TCleanup >::is_from_pool ( T *  obj) const
inline

Definition at line 84 of file object_pool.h.

85  {
86  for (auto& bound : m_chunk_bounds)
87  {
88  if (obj >= bound.first && obj <= bound.second)
89  {
90  return true;
91  }
92  }
93 
94  return false;
95  }
std::vector< std::pair< T *, T * > > m_chunk_bounds
Definition: object_pool.h:118

◆ new_chunk()

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
void VW::no_lock_object_pool< T, TInitializer, TCleanup >::new_chunk ( size_t  size)
inlineprivate

Definition at line 98 of file object_pool.h.

99  {
100  if (size == 0)
101  {
102  return;
103  }
104 
105  m_chunks.push_back(std::unique_ptr<T[]>(new T[size]));
106  auto& chunk = m_chunks.back();
107  m_chunk_bounds.push_back({&chunk[0], &chunk[size - 1]});
108 
109  for (size_t i = 0; i < size; i++)
110  {
111  memset(&chunk[i], 0, sizeof(T));
112  new (&chunk[i]) T{};
113  m_pool.push(m_initializer(&chunk[i]));
114  }
115  }
TInitializer m_initializer
Definition: object_pool.h:120
std::vector< std::unique_ptr< T[]> > m_chunks
Definition: object_pool.h:119
size_t size() const
Definition: object_pool.h:69
std::queue< T * > m_pool
Definition: object_pool.h:117
std::vector< std::pair< T *, T * > > m_chunk_bounds
Definition: object_pool.h:118

◆ return_object()

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
void VW::no_lock_object_pool< T, TInitializer, TCleanup >::return_object ( T *  obj)
inline

Definition at line 49 of file object_pool.h.

50  {
51  assert(is_from_pool(obj));
52  m_pool.push(obj);
53  }
std::queue< T * > m_pool
Definition: object_pool.h:117
bool is_from_pool(T *obj) const
Definition: object_pool.h:84

◆ size()

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
size_t VW::no_lock_object_pool< T, TInitializer, TCleanup >::size ( ) const
inline

Definition at line 69 of file object_pool.h.

70  {
71  size_t size = 0;
72  auto num_chunks = m_chunk_bounds.size();
73 
74  if (m_chunk_bounds.size() > 0 && m_initial_chunk_size > 0)
75  {
76  size += m_initial_chunk_size;
77  num_chunks--;
78  }
79 
80  size += num_chunks * m_chunk_size;
81  return size;
82  }
size_t size() const
Definition: object_pool.h:69
std::vector< std::pair< T *, T * > > m_chunk_bounds
Definition: object_pool.h:118

Member Data Documentation

◆ m_chunk_bounds

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
std::vector<std::pair<T*, T*> > VW::no_lock_object_pool< T, TInitializer, TCleanup >::m_chunk_bounds
private

Definition at line 118 of file object_pool.h.

◆ m_chunk_size

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
size_t VW::no_lock_object_pool< T, TInitializer, TCleanup >::m_chunk_size = 8
private

Definition at line 123 of file object_pool.h.

◆ m_chunks

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
std::vector<std::unique_ptr<T[]> > VW::no_lock_object_pool< T, TInitializer, TCleanup >::m_chunks
private

Definition at line 119 of file object_pool.h.

◆ m_cleanup

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
TCleanup VW::no_lock_object_pool< T, TInitializer, TCleanup >::m_cleanup
private

Definition at line 121 of file object_pool.h.

◆ m_initial_chunk_size

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
size_t VW::no_lock_object_pool< T, TInitializer, TCleanup >::m_initial_chunk_size = 0
private

Definition at line 122 of file object_pool.h.

◆ m_initializer

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
TInitializer VW::no_lock_object_pool< T, TInitializer, TCleanup >::m_initializer
private

Definition at line 120 of file object_pool.h.

◆ m_pool

template<typename T, typename TInitializer, typename TCleanup = default_cleanup<T>>
std::queue<T*> VW::no_lock_object_pool< T, TInitializer, TCleanup >::m_pool
private

Definition at line 117 of file object_pool.h.


The documentation for this struct was generated from the following file: