summaryrefslogtreecommitdiff
path: root/include/mbgl/util/thread.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/mbgl/util/thread.hpp')
-rw-r--r--include/mbgl/util/thread.hpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/include/mbgl/util/thread.hpp b/include/mbgl/util/thread.hpp
index 06254569a9..c0cbc532ce 100644
--- a/include/mbgl/util/thread.hpp
+++ b/include/mbgl/util/thread.hpp
@@ -131,6 +131,13 @@ public:
}
private:
+ template <class U>
+ friend class BlockingThreadGuard;
+
+ Object& getObject() {
+ return object->object;
+ }
+
MBGL_STORE_THREAD(tid);
void schedule(std::weak_ptr<Mailbox> mailbox) override {
@@ -157,11 +164,33 @@ private:
std::thread thread;
std::unique_ptr<Actor<Object>> object;
+ std::mutex pauseMutex;
std::unique_ptr<std::promise<void>> paused;
std::unique_ptr<std::promise<void>> resumed;
util::RunLoop* loop = nullptr;
};
+
+template <class Object>
+class BlockingThreadGuard {
+public:
+ BlockingThreadGuard(Thread<Object>& thread_)
+ : thread(thread_) {
+ thread.pause();
+ }
+
+ ~BlockingThreadGuard() {
+ thread.resume();
+ }
+
+ Object& object() {
+ return thread.getObject();
+ }
+
+private:
+ Thread<Object>& thread;
+};
+
} // namespace util
} // namespace mbgl