7#include <aws/core/utils/memory/stl/AWSVector.h>
9#include <condition_variable>
25 template<
typename RESOURCE_TYPE>
39 std::unique_lock<std::mutex> locker(m_queueLock);
40 while(!m_shutdown.load() && m_resources.size() == 0)
42 m_semaphore.wait(locker, [&](){
return m_shutdown.load() || m_resources.size() > 0; });
47 RESOURCE_TYPE resource = m_resources.back();
48 m_resources.pop_back();
59 RESOURCE_TYPE
TryAcquire(
typename std::enable_if<std::is_pointer<RESOURCE_TYPE>::value >::type* = 0)
61 std::unique_lock<std::mutex> locker(m_queueLock);
62 while(!m_shutdown.load() && m_resources.size() == 0)
64 m_semaphore.wait(locker, [&](){
return m_shutdown.load() || m_resources.size() > 0; });
71 RESOURCE_TYPE resource = m_resources.back();
72 m_resources.pop_back();
86 template <typename std::enable_if<std::is_pointer<RESOURCE_TYPE>::value>::type* =
nullptr>
88 std::unique_lock<std::mutex> locker(m_queueLock);
89 bool hasResource = m_shutdown.load() || !m_resources.empty();
91 hasResource = m_semaphore.wait_for(locker, std::chrono::milliseconds(timeoutMs),
92 [&]() {
return m_shutdown.load() || !m_resources.empty(); });
95 if (m_shutdown || !hasResource) {
99 RESOURCE_TYPE resource = m_resources.back();
100 m_resources.pop_back();
113 std::lock_guard<std::mutex> locker(m_queueLock);
114 return m_resources.size() > 0 && !m_shutdown.load();
124 std::unique_lock<std::mutex> locker(m_queueLock);
125 m_resources.push_back(resource);
127 m_semaphore.notify_one();
137 m_resources.push_back(resource);
151 std::unique_lock<std::mutex> locker(m_queueLock);
153 m_semaphore.notify_all();
156 while (m_resources.size() < resourceCount)
158 m_semaphore.wait(locker, [&]() {
return m_resources.size() == resourceCount; });
162 m_semaphore.notify_one();
168 std::mutex m_queueLock;
169 std::condition_variable m_semaphore;
170 std::atomic<bool> m_shutdown;
Aws::Vector< RESOURCE_TYPE > ShutdownAndWait(size_t resourceCount)
RESOURCE_TYPE TryAcquire(const uint64_t timeoutMs)
ExclusiveOwnershipResourceManager()
void Release(RESOURCE_TYPE resource)
void PutResource(RESOURCE_TYPE resource)
RESOURCE_TYPE TryAcquire(typename std::enable_if< std::is_pointer< RESOURCE_TYPE >::value >::type *=0)
bool HasResourcesAvailable()
std::vector< T, Aws::Allocator< T > > Vector