diff options
Diffstat (limited to 'src/mbgl/util/channel.hpp')
-rw-r--r-- | src/mbgl/util/channel.hpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/mbgl/util/channel.hpp b/src/mbgl/util/channel.hpp new file mode 100644 index 0000000000..a48156f120 --- /dev/null +++ b/src/mbgl/util/channel.hpp @@ -0,0 +1,39 @@ +#ifndef MBGL_UTIL_CHANNEL +#define MBGL_UTIL_CHANNEL + +#include <mbgl/util/noncopyable.hpp> + +#include <mutex> +#include <condition_variable> +#include <queue> + +namespace mbgl { + +template <class T> +class Channel : public mbgl::util::noncopyable { +public: + void send(const T& t) { + std::unique_lock<std::mutex> lock(mutex); + queue.push(t); + condition.notify_one(); + } + + T receive() { + std::unique_lock<std::mutex> lock(mutex); + condition.wait(lock, [&](){ return !queue.empty(); }); + + T t = queue.front(); + queue.pop(); + + return t; + } + +private: + std::mutex mutex; + std::condition_variable condition; + std::queue<T> queue; +}; + +} + +#endif |