AWS SDK for C++

AWS SDK for C++ Version 1.11.606

Loading...
Searching...
No Matches
ResourceManager.h
1
5#pragma once
6
7#include <aws/core/utils/memory/stl/AWSVector.h>
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);
46
47 RESOURCE_TYPE resource = m_resources.back();
48 m_resources.pop_back();
49
50 return resource;
51 }
52
59 RESOURCE_TYPE TryAcquire(typename std::enable_if<std::is_pointer<RESOURCE_TYPE>::value >::type* = 0)
60 {
61 std::unique_lock<std::mutex> locker(m_queueLock);
62 while(!m_shutdown.load() && m_resources.size() == 0)
63 {
64 m_semaphore.wait(locker, [&](){ return m_shutdown.load() || m_resources.size() > 0; });
65 }
66
67 if (m_shutdown) {
68 return nullptr;
69 }
70
71 RESOURCE_TYPE resource = m_resources.back();
72 m_resources.pop_back();
73
74 return resource;
75 }
76
86 template <typename std::enable_if<std::is_pointer<RESOURCE_TYPE>::value>::type* = nullptr>
87 RESOURCE_TYPE TryAcquire(const uint64_t timeoutMs) {
88 std::unique_lock<std::mutex> locker(m_queueLock);
89 bool hasResource = m_shutdown.load() || !m_resources.empty();
90 if (!hasResource) {
91 hasResource = m_semaphore.wait_for(locker, std::chrono::milliseconds(timeoutMs),
92 [&]() { return m_shutdown.load() || !m_resources.empty(); });
93 }
94
95 if (m_shutdown || !hasResource) {
96 return nullptr;
97 }
98
99 RESOURCE_TYPE resource = m_resources.back();
100 m_resources.pop_back();
101
102 return resource;
103 }
104
112 {
113 std::lock_guard<std::mutex> locker(m_queueLock);
114 return m_resources.size() > 0 && !m_shutdown.load();
115 }
116
122 void Release(RESOURCE_TYPE resource)
123 {
124 std::unique_lock<std::mutex> locker(m_queueLock);
125 m_resources.push_back(resource);
126 locker.unlock();
127 m_semaphore.notify_one();
128 }
129
135 void PutResource(RESOURCE_TYPE resource)
136 {
137 m_resources.push_back(resource);
138 }
139
150 {
151 std::unique_lock<std::mutex> locker(m_queueLock);
152 m_shutdown = true;
153 m_semaphore.notify_all();
154
155 //wait for all acquired resources to be released.
156 while (m_resources.size() < resourceCount)
157 {
158 m_semaphore.wait(locker, [&]() { return m_resources.size() == resourceCount; });
159 }
160
161 Aws::Vector<RESOURCE_TYPE> resources{std::move(m_resources)};
162 m_semaphore.notify_one();
163 return resources;
164 }
165
166 private:
167 Aws::Vector<RESOURCE_TYPE> m_resources;
168 std::mutex m_queueLock;
169 std::condition_variable m_semaphore;
170 std::atomic<bool> m_shutdown;
171 };
172 }
173}
Aws::Vector< RESOURCE_TYPE > ShutdownAndWait(size_t resourceCount)
RESOURCE_TYPE TryAcquire(const uint64_t timeoutMs)
RESOURCE_TYPE TryAcquire(typename std::enable_if< std::is_pointer< RESOURCE_TYPE >::value >::type *=0)
std::vector< T, Aws::Allocator< T > > Vector
Definition AWSVector.h:17