diff options
author | Max Kellermann <max@duempel.org> | 2013-01-10 00:08:25 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-01-10 00:10:01 +0100 |
commit | ecd5eb02c5094d3160db9d92937f7011e172c254 (patch) | |
tree | 10de3022544ec56b71865bc3cfd0c8a05607d5f0 /src/event/WakeFD.cxx | |
parent | 3be57dc4a30f1a4b059fec4bd7e46ae03d3c7107 (diff) | |
download | mpd-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.cxx | 36 |
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); |