20 #ifndef _ANCH_RES_POOL_H_ 21 #define _ANCH_RES_POOL_H_ 26 #include <condition_variable> 47 std::chrono::milliseconds _timeout;
61 TimeoutException(
const std::chrono::milliseconds& timeout,
const std::string msg) noexcept: std::exception(),
84 virtual const char*
what() const noexcept {
93 inline const std::chrono::milliseconds&
getTimeout() const noexcept {
116 template<
typename T,
typename C, std::shared_ptr<T>(*make_ptr)(const C&) = std::make_shared<T> >
128 class PoolableResource {
136 std::shared_ptr<T> _ptr;
154 virtual ~PoolableResource() {
155 if(_ptr.get()->isValid()) {
156 _pool.returnResource(_ptr);
158 _pool.invalidateResource(_ptr);
171 return *(_ptr.get());
182 std::condition_variable _wait;
188 std::deque<std::shared_ptr<T> > _availables;
191 std::size_t _maxSize;
194 std::atomic_size_t _used;
200 std::chrono::milliseconds _timeout;
215 std::size_t initialiSize = 0,
216 std::chrono::milliseconds timeout = std::chrono::milliseconds(100)):
225 for(std::size_t i = 0 ; i < initialiSize && i < maxSize ; ++i) {
227 std::shared_ptr<T> ptr = make_ptr(_config);
228 _availables.push_back(ptr);
248 while(!_availables.empty()) {
249 _availables.front().reset();
250 _availables.pop_front();
268 std::shared_ptr<T> ptr;
269 if(_availables.empty()) {
270 if(_used.load() < _maxSize) {
272 ptr = make_ptr(_config);
282 std::unique_lock<std::mutex> lock(_waitex);
283 if(_wait.wait_for(lock, _timeout, [
this](){return !this->_availables.empty();})) {
285 ptr = _availables.front();
286 _availables.pop_front();
295 ptr = _availables.front();
296 _availables.pop_front();
300 return PoolableResource(*
this, ptr);
309 void returnResource(std::shared_ptr<T> res) {
310 std::lock_guard<std::mutex> lock(_mutex);
311 _availables.push_back(res);
322 void invalidateResource(std::shared_ptr<T> res) {
326 _availables.push_back(make_ptr(_config));
341 inline void setTimeout(
const std::chrono::milliseconds timeout) {
350 #endif // _ANCH_RES_POOL_H_ virtual ~ResourcePool()
Definition: resourcePool.hpp:247
virtual const char * what() const noexcept
Definition: resourcePool.hpp:84
Timeout exception.
Definition: resourcePool.hpp:42
AnCH framework base namespace.
Definition: base64.hpp:28
const std::chrono::milliseconds & getTimeout() const noexcept
Definition: resourcePool.hpp:93
TimeoutException(const std::chrono::milliseconds &timeout, const std::string msg) noexcept
Definition: resourcePool.hpp:61
virtual ~TimeoutException()
Definition: resourcePool.hpp:72
ResourcePool(const C &config, std::size_t maxSize, std::size_t initialiSize=0, std::chrono::milliseconds timeout=std::chrono::milliseconds(100))
Definition: resourcePool.hpp:213
Generic resource pool utility class.
Definition: resourcePool.hpp:117
PoolableResource borrowResource()
Definition: resourcePool.hpp:266
void setTimeout(const std::chrono::milliseconds timeout)
Definition: resourcePool.hpp:341