18 #ifndef DS3D_COMMON_HELPER_SAFE_QUEUE_H
19 #define DS3D_COMMON_HELPER_SAFE_QUEUE_H
21 #include <ds3d/common/common.h>
22 #include <ds3d/common/func_utils.h>
29 template <
typename T,
typename Container = std::deque<T>>
35 std::unique_lock<std::mutex> lock(_mutex);
36 _queue.emplace_back(std::move(data));
39 T
pop(uint64_t timeoutMs = 0)
41 std::unique_lock<std::mutex> lock(_mutex);
42 auto stopWait = [
this]() {
return _wakeupOnce || !_queue.empty(); };
44 _cond.wait(lock, stopWait);
46 using namespace std::chrono_literals;
47 if (!_cond.wait_for(lock, timeoutMs * 1ms, stopWait)) {
53 LOG_DEBUG(
"SafeQueue pop end on wakeup signal");
56 assert(!_queue.empty());
57 T ret = std::move(*_queue.begin());
58 _queue.erase(_queue.begin());
63 LOG_DEBUG(
"SafeQueue trigger wakeup once");
64 std::unique_lock<std::mutex> lock(_mutex);
71 std::unique_lock<std::mutex> lock(_mutex);
77 std::unique_lock<std::mutex> lock(_mutex);
83 std::condition_variable _cond;
85 bool _wakeupOnce =
false;
88 template <
class UniPtr>
89 class BufferPool :
public std::enable_shared_from_this<BufferPool<UniPtr>> {
91 using ItemType =
typename UniPtr::element_type;
97 "BufferPool: %s deleted with free buffer size:%d", m_Name.c_str(),
98 (
int)m_FreeBuffers.size());
103 m_FreeBuffers.push(std::move(buf));
105 "BufferPool: %s set buf to free, available size:%d", m_Name.c_str(),
106 (
int)m_FreeBuffers.size());
109 uint32_t
size() {
return m_FreeBuffers.size(); }
114 UniPtr p = m_FreeBuffers.pop();
115 auto deleter = p.get_deleter();
116 std::weak_ptr<BufferPool<UniPtr>> poolPtr = this->shared_from_this();
120 auto pool = poolPtr.lock();
122 LOG_DEBUG(
"BufferPool: %s release a buffer", pool->m_Name.c_str());
123 pool->setBuffer(std::move(data));
125 LOG_DEBUG(
"BufferPool was deleted before buffer release, maybe application is closing.");
130 "BufferPool: %s acquired buffer, available free buffer left:%d", m_Name.c_str(),
131 (
int)m_FreeBuffers.size());
136 "BufferPool: %s acquired buffer failed, queue may be waked up", m_Name.c_str());
143 SafeQueue<UniPtr> m_FreeBuffers;
144 const std::string m_Name;