summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2025-10-20 22:07:49 +0200
committerJoel Klinghed <the_jk@spawned.biz>2025-10-21 23:15:29 +0200
commite0a0365383a3baf1a13b68c476421a85d29a244b (patch)
tree6f04e9f9a1d17edc476835e045e656833b419f00
parentaa1c7942422ce96ce8a47830ec78687932766a73 (diff)
signals: Replace pipe with eventfd
Simplify code.
-rw-r--r--meson.build2
-rw-r--r--src/signals.cc22
-rw-r--r--src/unique_pipe.cc32
-rw-r--r--src/unique_pipe.hh42
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