Commit ecd5eb02 authored by Max Kellermann's avatar Max Kellermann

event/WakeFD: use eventfd() if available

parent 3be57dc4
...@@ -24,12 +24,24 @@ ...@@ -24,12 +24,24 @@
#include <unistd.h> #include <unistd.h>
#ifdef HAVE_EVENTFD
#include <sys/eventfd.h>
#endif
bool bool
WakeFD::Create() WakeFD::Create()
{ {
assert(fds[0] == -1); assert(fds[0] == -1);
assert(fds[1] == -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; return pipe_cloexec_nonblock(fds) >= 0;
} }
...@@ -40,7 +52,10 @@ WakeFD::Destroy() ...@@ -40,7 +52,10 @@ WakeFD::Destroy()
/* By some strange reason this call hangs on Win32 */ /* By some strange reason this call hangs on Win32 */
close(fds[0]); close(fds[0]);
#endif #endif
close(fds[1]); #ifdef HAVE_EVENTFD
if (!IsEventFD())
#endif
close(fds[1]);
#ifndef NDEBUG #ifndef NDEBUG
fds[0] = -1; fds[0] = -1;
...@@ -52,6 +67,15 @@ bool ...@@ -52,6 +67,15 @@ bool
WakeFD::Read() WakeFD::Read()
{ {
assert(fds[0] >= 0); 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); assert(fds[1] >= 0);
char buffer[256]; char buffer[256];
...@@ -62,6 +86,16 @@ void ...@@ -62,6 +86,16 @@ void
WakeFD::Write() WakeFD::Write()
{ {
assert(fds[0] >= 0); 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); assert(fds[1] >= 0);
gcc_unused ssize_t nbytes = write(fds[1], "", 1); gcc_unused ssize_t nbytes = write(fds[1], "", 1);
......
...@@ -48,7 +48,9 @@ public: ...@@ -48,7 +48,9 @@ public:
int Get() const { int Get() const {
assert(fds[0] >= 0); assert(fds[0] >= 0);
#ifndef HAVE_EVENTFD
assert(fds[1] >= 0); assert(fds[1] >= 0);
#endif
return fds[0]; return fds[0];
} }
...@@ -64,6 +66,15 @@ public: ...@@ -64,6 +66,15 @@ public:
* be combined to one wakeup. * be combined to one wakeup.
*/ */
void Write(); void Write();
private:
#ifdef HAVE_EVENTFD
bool IsEventFD() {
assert(fds[0] >= 0);
return fds[1] == -2;
}
#endif
}; };
#endif /* MAIN_NOTIFY_H */ #endif /* MAIN_NOTIFY_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment