Pottu
SharedResourcePool.hpp
1 /*
2  *
3  */
4 
5 
6 #ifndef H_POTTU_SHAREDRESOURCEPOOL
7 #define H_POTTU_SHAREDRESOURCEPOOL
8 
9 
10 #include "memory.hpp"
11 
12 #include <vector>
13 
14 namespace pottu {
15 
16  template <class Pool>
18 
19  PooledResourceDeleter() = default;
20  PooledResourceDeleter( Pool *pool ) : _pool(pool) {}
21  void operator()( typename Pool::resource_t *e ) {
22  if( _pool )
23  _pool->_returnToPool( e );
24  //else
25  // Pool::_releaseResourceNoPool( e );
26  }
27  Pool *_pool{nullptr};
28  };
29 
30 
36  template <class Ev>
38  public:
39 
40  using resource_t = Ev;
43 
44 
48  {}
49 
50 
54  for( auto &ev : _pool )
55  delete ev;
56  }
57 
58 
59  SharedResourcePool( const SharedResourcePool &o ) = delete;
60  SharedResourcePool( SharedResourcePool &&o ) = delete;
61 
62 
63 
64 
65  /*****************************************************/
66  // Returns a new or recycled logical event. This speeds up since
67  // less memory allocations needed.
68  /*****************************************************/
69  std::vector<Ev *> _pool;
70  size_t _eventsAllocated{0};
71  size_t _eventsGiven{0};
72  size_t _eventsReturned{0};
73  logical_event_handle_t get() noexcept {
74  ++_eventsGiven;
75  if( _pool.size() ) {
76  Ev *e{ _pool.back() };
77  _pool.pop_back();
78  return logical_event_handle_t{ e, resource_deleter_t(this) };
79  } else {
80  ++_eventsAllocated;
81  auto p = new Ev;
82  p->clear();
83  return logical_event_handle_t{ p, resource_deleter_t(this) };
84  }
85  }
86 
87  private:
88  friend resource_deleter_t;
89  /*****************************************************/
90  // Puts back the logical event into the pool for next use.
91  /*****************************************************/
92  void _returnToPool( Ev *e ) noexcept {
93  //ContextBase::logInfo( "_returnToPool" );
94  ++_eventsReturned;
95  e->clear();
96  _pool.push_back( e );
97  }
98 
101  static void _releaseResourceNoPool( Ev *e ) noexcept {
102  delete e;
103  }
104 
105  };
106 
107 }
108 
109 
110 #endif
Handle for a resource derived from SharedResource.
Definition: memory.hpp:43
Pool for SharedResource derived objects.
Definition: SharedResourcePool.hpp:37
SharedResourcePool()
Constructor.
Definition: SharedResourcePool.hpp:47
~SharedResourcePool()
Destructor.
Definition: SharedResourcePool.hpp:53
Definition: mainpage.dox:6
Definition: SharedResourcePool.hpp:17