From: subhransu mohanty Date: Wed, 18 Jul 2018 03:27:53 +0000 (+0900) Subject: lottie/vector: added taskqueue class in preparation for multithreaded backend X-Git-Tag: submit/tizen/20180917.042405~224 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2e9d054a7b38a4d781116ab7e231adc5adb74504;p=platform%2Fcore%2Fuifw%2Flottie-player.git lottie/vector: added taskqueue class in preparation for multithreaded backend Change-Id: I0b5e5cab84b383bc48f846f99807870178672a1f --- 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