13 assert(
m_deque.max_size() > this->get_capacity());
21 auto start_time = std::chrono::steady_clock::now();
22 std::unique_lock<std::mutex> lk(
m_mutex, std::defer_lock);
26 auto time_to_wait_for_space = (
start_time + timeout) - std::chrono::steady_clock::now();
28 if (time_to_wait_for_space.count() > 0) {
33 m_deque.push_back(std::move(object_to_push));
37 throw QueueTimeoutExpired(
38 ERS_HERE, this->
get_name(),
"push", std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count());
47 auto start_time = std::chrono::steady_clock::now();
48 std::unique_lock<std::mutex> lk(
m_mutex, std::defer_lock);
52 auto time_to_wait_for_data = (
start_time + timeout) - std::chrono::steady_clock::now();
54 if (time_to_wait_for_data.count() > 0) {
59 val = std::move(
m_deque.front());
64 throw QueueTimeoutExpired(
65 ERS_HERE, this->
get_name(),
"pop", std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count());
74 auto start_time = std::chrono::steady_clock::now();
75 std::unique_lock<std::mutex> lk(
m_mutex, std::defer_lock);
79 auto time_to_wait_for_space = (
start_time + timeout) - std::chrono::steady_clock::now();
81 if (time_to_wait_for_space.count() > 0) {
86 m_deque.push_back(std::move(object_to_push));
92 ERS_HERE, this->
get_name(),
"push", std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count()));
102 auto start_time = std::chrono::steady_clock::now();
103 std::unique_lock<std::mutex> lk(
m_mutex, std::defer_lock);
107 auto time_to_wait_for_data = (
start_time + timeout) - std::chrono::steady_clock::now();
109 if (time_to_wait_for_data.count() > 0) {
114 val = std::move(
m_deque.front());
121 ERS_HERE, this->
get_name(),
"pop", std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count()));
135 assert(!lk.owns_lock());
137 auto start_time = std::chrono::steady_clock::now();
138 auto ret = lk.try_lock();
140 if ((!ret || !lk.owns_lock()) && timeout.count() > 0) {
142 int approximate_number_of_retries = 5;
145 while (std::chrono::steady_clock::now() <
start_time + timeout) {
146 std::this_thread::sleep_for(pause_between_tries);
148 if (ret && lk.owns_lock()) {
154 if (!lk.owns_lock()) {
155 throw QueueTimeoutExpired(
156 ERS_HERE, this->
get_name(),
"lock mutex", std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count());
Queue(const std::string &name)
Queue Constructor.
void pop(value_t &val, const duration_t &) override
Pop the first value off of the queue.
std::deque< value_t > m_deque
void push(value_t &&, const duration_t &) override
Push a value onto the Queue.
void try_lock_for(std::unique_lock< std::mutex > &, const duration_t &)
std::atomic< size_t > m_size
bool can_pop() const noexcept override
Determine whether the Queue may be popped from.
StdDeQueue(const std::string &name, size_t capacity)
StdDeQueue Constructor.
bool can_push() const noexcept override
Determine whether the Queue may be pushed onto.
bool try_pop(value_t &val, const duration_t &) override
typename Queue< T >::duration_t duration_t
Type used for expressing timeouts.
std::condition_variable m_no_longer_full
bool try_push(value_t &&, const duration_t &) override
std::condition_variable m_no_longer_empty
T value_t
Type of data stored in the StdDeQueue.
const std::string & get_name() const final
Get the name of this NamedObejct.
Cannot add TPSet with start_time
void error(const Issue &issue)