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/signal_handler.cc | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/signal_handler.cc (limited to 'src/signal_handler.cc') diff --git a/src/signal_handler.cc b/src/signal_handler.cc new file mode 100644 index 0000000..7d64e60 --- /dev/null +++ b/src/signal_handler.cc @@ -0,0 +1,75 @@ +#include "common.hh" + +#include "io.hh" +#include "looper.hh" +#include "signal_handler.hh" +#include "unique_pipe.hh" + +#include +#include + +namespace { + +std::unordered_map g_fds; + +int signum(SignalHandler::Signal signal) { + switch (signal) { + case SignalHandler::Signal::INT: + return SIGINT; + case SignalHandler::Signal::TERM: + return SIGTERM; + case SignalHandler::Signal::HUP: + return SIGHUP; + } + assert(false); + return 0; +} + +void signal_handler(int signum) { + auto it = g_fds.find(signum); + if (it != g_fds.end()) { + char c = 1; + io::write(it->second, &c, 1); + } +} + +class SignalHandlerImpl : public SignalHandler { +public: + SignalHandlerImpl(std::shared_ptr looper, Signal signal, + std::function callback) + : looper_(looper), signal_(signum(signal)), callback_(std::move(callback)) { + looper_->add(pipe_.reader(), Looper::EVENT_READ, + std::bind(&SignalHandlerImpl::call, this, + std::placeholders::_1)); + g_fds[signal_] = pipe_.writer(); + + ::signal(signal_, signal_handler); + } + + ~SignalHandlerImpl() { + signal(signal_, SIG_DFL); + looper_->remove(pipe_.reader()); + g_fds.erase(signal_); + } + +private: + void call(uint8_t) { + char buf[10]; + io::read(pipe_.reader(), buf, 10); + callback_(); + } + + unique_pipe pipe_; + std::shared_ptr looper_; + int signal_; + std::function callback_; +}; + +} // namespace + +std::unique_ptr SignalHandler::create( + std::shared_ptr looper, Signal signal, + std::function callback) { + return std::make_unique( + std::move(looper), signal, std::move(callback)); +} -- cgit v1.2.3-70-g09d2