From 6232d13f5321b87ddf12a1aa36b4545da45f173d Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Wed, 17 Nov 2021 22:34:57 +0100 Subject: Travel3: Simple image and video display site Reads the images and videos from filesystem and builds a site in memroy. --- src/task_runner_looper.cc | 75 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/task_runner_looper.cc (limited to 'src/task_runner_looper.cc') diff --git a/src/task_runner_looper.cc b/src/task_runner_looper.cc new file mode 100644 index 0000000..4c1292b --- /dev/null +++ b/src/task_runner_looper.cc @@ -0,0 +1,75 @@ +#include "common.hh" + +#include +#include + +#include "io.hh" +#include "looper.hh" +#include "task_runner.hh" +#include "unique_pipe.hh" + +namespace { + +constexpr char kMessage = 1; + +class TaskRunnerLooper : public TaskRunner { +public: + explicit TaskRunnerLooper(std::shared_ptr looper) + : looper_(looper), pipe_(true, false) { + looper_->add(pipe_.reader(), Looper::EVENT_READ, + std::bind(&TaskRunnerLooper::run, this, + std::placeholders::_1)); + } + + ~TaskRunnerLooper() override { + looper_->remove(pipe_.reader()); + } + + void post(std::function callback) override { + bool notify; + { + std::lock_guard lock(mutex_); + notify = queue_.empty(); + queue_.push_back(std::move(callback)); + } + if (notify) + io::write_all(pipe_.writer(), &kMessage, 1); + } + +private: + void run(uint8_t event) { + if (event & Looper::EVENT_READ) { + char in[1]; + io::read_all(pipe_.reader(), &in, 1); + } + if (event & Looper::EVENT_ERROR) { + assert(false); + looper_->quit(); + } + bool more; + do { + std::function callback; + { + std::lock_guard lock(mutex_); + if (queue_.empty()) + break; + callback = std::move(queue_.front()); + queue_.pop_front(); + more = !queue_.empty(); + } + callback(); + } while (more); + } + + std::shared_ptr looper_; + unique_pipe pipe_; + std::mutex mutex_; + std::deque> queue_; +}; + +} // namespace + +std::unique_ptr TaskRunner::create(std::shared_ptr looper) { + return std::make_unique(looper); +} + -- cgit v1.2.3-70-g09d2