summaryrefslogtreecommitdiff
path: root/src/mbgl/util/channel.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/util/channel.hpp')
-rw-r--r--src/mbgl/util/channel.hpp39
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