diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2025-10-20 22:07:49 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2025-10-21 23:15:29 +0200 |
| commit | e0a0365383a3baf1a13b68c476421a85d29a244b (patch) | |
| tree | 6f04e9f9a1d17edc476835e045e656833b419f00 | |
| parent | aa1c7942422ce96ce8a47830ec78687932766a73 (diff) | |
signals: Replace pipe with eventfd
Simplify code.
| -rw-r--r-- | meson.build | 2 | ||||
| -rw-r--r-- | src/signals.cc | 22 | ||||
| -rw-r--r-- | src/unique_pipe.cc | 32 | ||||
| -rw-r--r-- | src/unique_pipe.hh | 42 |
4 files changed, 12 insertions, 86 deletions
diff --git a/meson.build b/meson.build index fef8e92..58f38a0 100644 --- a/meson.build +++ b/meson.build @@ -70,8 +70,6 @@ io_lib = library( 'src/io.hh', 'src/unique_fd.cc', 'src/unique_fd.hh', - 'src/unique_pipe.cc', - 'src/unique_pipe.hh', ], include_directories: inc, ) diff --git a/src/signals.cc b/src/signals.cc index 9f8bff7..5ac1a32 100644 --- a/src/signals.cc +++ b/src/signals.cc @@ -1,13 +1,14 @@ #include "signals.hh" #include "looper.hh" -#include "unique_pipe.hh" +#include "unique_fd.hh" #include <cerrno> #include <csignal> #include <cstdint> #include <functional> #include <memory> +#include <sys/eventfd.h> #include <unistd.h> #include <unordered_map> #include <utility> @@ -31,9 +32,9 @@ int signum(Signal signal) { void signal_handler(int signum) { auto it = g_fds.find(signum); if (it != g_fds.end()) { - char c = 1; + uint64_t c = 1; while (true) { - auto ret = write(it->second, &c, 1); + auto ret = write(it->second, &c, sizeof(c)); if (ret < 0 && errno == EINTR) continue; break; @@ -45,27 +46,28 @@ class HandlerImpl : public Handler { public: HandlerImpl(looper::Looper& looper, Signal signal, std::function<void()> callback) - : looper_(looper), + : fd_{eventfd(0, 0)}, + looper_(looper), signal_(signum(signal)), callback_(std::move(callback)) { - looper_.add(pipe_.reader(), looper::EVENT_READ, + looper_.add(fd_.get(), looper::EVENT_READ, [this](auto event) { call(event); }); - g_fds[signal_] = pipe_.writer(); + g_fds[signal_] = fd_.get(); ::signal(signal_, signal_handler); } ~HandlerImpl() override { ::signal(signal_, SIG_DFL); - looper_.remove(pipe_.reader()); + looper_.remove(fd_.get()); g_fds.erase(signal_); } private: void call(uint8_t /* event */) { - char buf[10]; + uint64_t c; while (true) { - auto ret = read(pipe_.reader(), buf, 10); + auto ret = read(fd_.get(), &c, sizeof(c)); if (ret < 0 && errno == EINTR) continue; break; @@ -73,7 +75,7 @@ class HandlerImpl : public Handler { callback_(); } - unique_pipe pipe_; + unique_fd fd_; looper::Looper& looper_; int signal_; std::function<void()> callback_; diff --git a/src/unique_pipe.cc b/src/unique_pipe.cc deleted file mode 100644 index 28c106d..0000000 --- a/src/unique_pipe.cc +++ /dev/null @@ -1,32 +0,0 @@ -#include "unique_pipe.hh" - -#include <unistd.h> -#include <utility> - -unique_pipe::unique_pipe() { - int fd[2]; - if (pipe(fd)) - return; - fd_[0] = unique_fd(fd[0]); - fd_[1] = unique_fd(fd[1]); -} - -unique_pipe::unique_pipe(unique_pipe&& fd) { - fd_[0] = unique_fd(fd.fd_[0].release()); - fd_[1] = unique_fd(fd.fd_[1].release()); -} - -unique_pipe& unique_pipe::operator=(unique_pipe&& fd) { - fd_[0].reset(fd.fd_[0].release()); - fd_[1].reset(fd.fd_[1].release()); - return *this; -} - -void unique_pipe::reset() { - fd_[0].reset(); - fd_[1].reset(); -} - -unique_fd unique_pipe::release_reader() { return std::move(fd_[0]); } - -unique_fd unique_pipe::release_writer() { return std::move(fd_[1]); } diff --git a/src/unique_pipe.hh b/src/unique_pipe.hh deleted file mode 100644 index c133018..0000000 --- a/src/unique_pipe.hh +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef UNIQUE_PIPE_HH -#define UNIQUE_PIPE_HH - -#include "unique_fd.hh" - -#include <cstddef> - -class unique_pipe { - public: - unique_pipe(); - unique_pipe(unique_pipe&& fd); - unique_pipe(unique_pipe const&) = delete; - unique_pipe& operator=(unique_pipe const&) = delete; - - ~unique_pipe() = default; - - unique_pipe& operator=(unique_pipe&& fd); - - [[nodiscard]] - int reader() const { - return fd_[0].get(); - } - [[nodiscard]] - int writer() const { - return fd_[1].get(); - } - - [[nodiscard]] - explicit operator bool() const { - return fd_[0] || fd_[1]; - } - - void reset(); - - unique_fd release_reader(); - unique_fd release_writer(); - - private: - unique_fd fd_[2]; -}; - -#endif // UNIQUE_PIPE_HH |
