From 2e9d054a7b38a4d781116ab7e231adc5adb74504 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 12:27:53 +0900 Subject: [PATCH] lottie/vector: added taskqueue class in preparation for multithreaded backend Change-Id: I0b5e5cab84b383bc48f846f99807870178672a1f --- src/vector/vtaskqueue.h | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/vector/vtaskqueue.h diff --git a/src/vector/vtaskqueue.h b/src/vector/vtaskqueue.h new file mode 100644 index 0000000..5318f0e --- /dev/null +++ b/src/vector/vtaskqueue.h @@ -0,0 +1,60 @@ +#ifndef VTASKQUEUE_H +#define VTASKQUEUE_H + +#include + +template +class TaskQueue { + using lock_t = std::unique_lock; + std::deque _q; + bool _done{false}; + std::mutex _mutex; + std::condition_variable _ready; + +public: + bool try_pop(Task *&task) { + lock_t lock{_mutex, std::try_to_lock}; + if (!lock || _q.empty()) return false; + task = std::move(_q.front()); + _q.pop_front(); + return true; + } + + bool try_push(Task *task) { + { + lock_t lock{_mutex, std::try_to_lock}; + if (!lock) return false; + _q.push_back(task); + } + _ready.notify_one(); + return true; + } + + void done() { + { + lock_t lock{_mutex}; + _done = true; + } + _ready.notify_all(); + } + + bool pop(Task *&task) { + lock_t lock{_mutex}; + while (_q.empty() && !_done) + _ready.wait(lock); + if (_q.empty()) return false; + task = std::move(_q.front()); + _q.pop_front(); + return true; + } + + void push(Task *task) { + { + lock_t lock{_mutex}; + _q.push_back(task); + } + _ready.notify_one(); + } +}; + +#endif // VTASKQUEUE_H -- 2.7.4