Fishnet 2.0.1
Framework for Graph-Based Analysis of GIS Vector Data
Loading...
Searching...
No Matches
BlockingQueue.hpp
Go to the documentation of this file.
1#pragma once
2#include <mutex>
3#include <condition_variable>
4#include <queue>
5#include <fishnet/Option.hpp>
6
7namespace fishnet::util{
13template<typename T>
15protected:
16 mutable std::mutex mutex;
17 std::queue<fishnet::Option<T>> queue;
18 std::condition_variable waitOnNotEmpty;
19 std::condition_variable waitOnNotFull;
20 static inline fishnet::Option<T> POISON_PILL = std::nullopt;
21public:
22
24 this->put(POISON_PILL);
25 }
26
28 return POISON_PILL;
29 }
30
31 virtual void put(fishnet::Option<T> element){
32 {
33 std::unique_lock<std::mutex> lock(mutex);
34 this->queue.push(std::move(element));
35 }
36 waitOnNotEmpty.notify_one();
37 }
38
41 {
42 std::unique_lock<std::mutex>lock(mutex);
43 while(this->queue.empty()){
44 waitOnNotEmpty.wait(lock);
45 }
46 val = queue.front();
47 queue.pop();
48 }
49 waitOnNotFull.notify_one();
50 return val;
51 }
52
53 size_t size() const {
54 std::lock_guard<std::mutex> lock(mutex);
55 return this->queue.size();
56 }
57};
58}
Definition Option.hpp:13
Blocking queue implementation. Blocks when no elements are present and take() is called until further...
Definition BlockingQueue.hpp:14
fishnet::Option< T > take()
Definition BlockingQueue.hpp:39
std::queue< fishnet::Option< T > > queue
Definition BlockingQueue.hpp:17
size_t size() const
Definition BlockingQueue.hpp:53
std::condition_variable waitOnNotEmpty
Definition BlockingQueue.hpp:18
const fishnet::Option< T > & getPoisonPill()
Definition BlockingQueue.hpp:27
virtual void put(fishnet::Option< T > element)
Definition BlockingQueue.hpp:31
static fishnet::Option< T > POISON_PILL
Definition BlockingQueue.hpp:20
void putPoisonPill()
Definition BlockingQueue.hpp:23
std::condition_variable waitOnNotFull
Definition BlockingQueue.hpp:19
std::mutex mutex
Definition BlockingQueue.hpp:16
Definition AlternativeKeyMap.hpp:4