aboutsummaryrefslogtreecommitdiffstats
path: root/src/event/WakeFD.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-01-10 00:08:25 +0100
committerMax Kellermann <max@duempel.org>2013-01-10 00:10:01 +0100
commitecd5eb02c5094d3160db9d92937f7011e172c254 (patch)
tree10de3022544ec56b71865bc3cfd0c8a05607d5f0 /src/event/WakeFD.cxx
parent3be57dc4a30f1a4b059fec4bd7e46ae03d3c7107 (diff)
downloadmpd-ecd5eb02c5094d3160db9d92937f7011e172c254.tar.gz
mpd-ecd5eb02c5094d3160db9d92937f7011e172c254.tar.xz
mpd-ecd5eb02c5094d3160db9d92937f7011e172c254.zip
event/WakeFD: use eventfd() if available
Diffstat (limited to 'src/event/WakeFD.cxx')
-rw-r--r--src/event/WakeFD.cxx36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/event/WakeFD.cxx b/src/event/WakeFD.cxx
index 7314342d8..a09f1bf7c 100644
--- a/src/event/WakeFD.cxx
+++ b/src/event/WakeFD.cxx
@@ -24,12 +24,24 @@
#include <unistd.h>
+#ifdef HAVE_EVENTFD
+#include <sys/eventfd.h>
+#endif
+
bool
WakeFD::Create()
{
assert(fds[0] == -1);
assert(fds[1] == -1);
+#ifdef HAVE_EVENTFD
+ fds[0] = eventfd_cloexec_nonblock(0, 0);
+ if (fds[0] >= 0) {
+ fds[1] = -2;
+ return true;
+ }
+#endif
+
return pipe_cloexec_nonblock(fds) >= 0;
}
@@ -40,7 +52,10 @@ WakeFD::Destroy()
/* By some strange reason this call hangs on Win32 */
close(fds[0]);
#endif
- close(fds[1]);
+#ifdef HAVE_EVENTFD
+ if (!IsEventFD())
+#endif
+ close(fds[1]);
#ifndef NDEBUG
fds[0] = -1;
@@ -52,6 +67,15 @@ bool
WakeFD::Read()
{
assert(fds[0] >= 0);
+
+#ifdef HAVE_EVENTFD
+ if (IsEventFD()) {
+ eventfd_t value;
+ return read(fds[0], &value,
+ sizeof(value)) == (ssize_t)sizeof(value);
+ }
+#endif
+
assert(fds[1] >= 0);
char buffer[256];
@@ -62,6 +86,16 @@ void
WakeFD::Write()
{
assert(fds[0] >= 0);
+
+#ifdef HAVE_EVENTFD
+ if (IsEventFD()) {
+ static constexpr eventfd_t value = 1;
+ gcc_unused ssize_t nbytes =
+ write(fds[0], &value, sizeof(value));
+ return;
+ }
+#endif
+
assert(fds[1] >= 0);
gcc_unused ssize_t nbytes = write(fds[1], "", 1);