diff --git a/NEWS b/NEWS index 81a5e6b26..2206a506f 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ ver 0.21.23 (not yet released) - curl: unescape "href" values * input - nfs: fix crash bug + - nfs: fix freeze bug on reconnect * decoder - gme: adapt to API change in the upcoming version 0.7.0 * output diff --git a/src/event/SocketMonitor.cxx b/src/event/SocketMonitor.cxx index f335c8fdc..00a2663b3 100644 --- a/src/event/SocketMonitor.cxx +++ b/src/event/SocketMonitor.cxx @@ -20,6 +20,10 @@ #include "SocketMonitor.hxx" #include "Loop.hxx" +#ifdef USE_EPOLL +#include +#endif + #include #ifdef _WIN32 @@ -86,6 +90,21 @@ SocketMonitor::Schedule(unsigned flags) noexcept if (success) scheduled_flags = flags; +#ifdef USE_EPOLL + else if (errno == EBADF || errno == ENOENT) + /* the socket was probably closed by somebody else + (EBADF) or a new file descriptor with the same + number was created but not registered already + (ENOENT) - we can assume that there are no + scheduled events */ + /* note that when this happens, we're actually lucky + that it has failed - imagine another thread may + meanwhile have created something on the same file + descriptor number, and has registered it; the + epoll_ctl() call above would then have succeeded, + but broke the other thread's epoll registration */ + scheduled_flags = 0; +#endif return success; }