AWS SDK for C++
AWS SDK for C++
Loading...
Searching...
No Matches
ResourceManager.h
Go to the documentation of this file.
1
5#pragma once
6
8#include <mutex>
9#include <condition_variable>
10#include <atomic>
11#include <cassert>
12
13namespace Aws
14{
15 namespace Utils
16 {
25 template< typename RESOURCE_TYPE>
27 {
28 public:
29 ExclusiveOwnershipResourceManager() : m_shutdown(false) {}
30
37 RESOURCE_TYPE Acquire()
38 {
39 std::unique_lock<std::mutex> locker(m_queueLock);
40 while(!m_shutdown.load() && m_resources.size() == 0)
41 {
42 m_semaphore.wait(locker, [&](){ return m_shutdown.load() || m_resources.size() > 0; });
43 }
44
45 assert(!m_shutdown.load());
46
47 RESOURCE_TYPE resource = m_resources.back();
48 m_resources.pop_back();
49
50 return resource;
51 }
52
60 {
61 std::lock_guard<std::mutex> locker(m_queueLock);
62 return m_resources.size() > 0 && !m_shutdown.load();
63 }
64
70 void Release(RESOURCE_TYPE resource)
71 {
72 std::unique_lock<std::mutex> locker(m_queueLock);
73 m_resources.push_back(resource);
74 locker.unlock();
75 m_semaphore.notify_one();
76 }
77
83 void PutResource(RESOURCE_TYPE resource)
84 {
85 m_resources.push_back(resource);
86 }
87
98 {
99 std::unique_lock<std::mutex> locker(m_queueLock);
100 m_shutdown = true;
101
102 //wait for all acquired resources to be released.
103 while (m_resources.size() < resourceCount)
104 {
105 m_semaphore.wait(locker, [&]() { return m_resources.size() == resourceCount; });
106 }
107
108 Aws::Vector<RESOURCE_TYPE> resources{std::move(m_resources)};
109
110 return resources;
111 }
112
113 private:
114 Aws::Vector<RESOURCE_TYPE> m_resources;
115 std::mutex m_queueLock;
116 std::condition_variable m_semaphore;
117 std::atomic<bool> m_shutdown;
118 };
119 }
120}
Aws::Vector< RESOURCE_TYPE > ShutdownAndWait(size_t resourceCount)
void PutResource(RESOURCE_TYPE resource)
std::vector< T, Aws::Allocator< T > > Vector
Definition: AWSVector.h:17