Commit 154bdf0b authored by Max Kellermann's avatar Max Kellermann

event/SocketMonitor: add method Abandon()

parent ed436c6f
...@@ -58,13 +58,18 @@ EventLoop::Break() ...@@ -58,13 +58,18 @@ EventLoop::Break()
AddCall([this]() { Break(); }); AddCall([this]() { Break(); });
} }
bool void
EventLoop::RemoveFD(int _fd, SocketMonitor &m) EventLoop::Abandon(SocketMonitor &m)
{ {
for (unsigned i = 0, n = n_events; i < n; ++i) for (unsigned i = 0, n = n_events; i < n; ++i)
if (events[i].data.ptr == &m) if (events[i].data.ptr == &m)
events[i].events = 0; events[i].events = 0;
}
bool
EventLoop::RemoveFD(int _fd, SocketMonitor &m)
{
Abandon(m);
return epoll.Remove(_fd); return epoll.Remove(_fd);
} }
......
...@@ -121,6 +121,13 @@ public: ...@@ -121,6 +121,13 @@ public:
return epoll.Modify(_fd, flags, &m); return epoll.Modify(_fd, flags, &m);
} }
/**
* Remove the given #SocketMonitor after the file descriptor
* has been closed. This is like RemoveFD(), but does not
* attempt to use #EPOLL_CTL_DEL.
*/
void Abandon(SocketMonitor &m);
bool RemoveFD(int fd, SocketMonitor &m); bool RemoveFD(int fd, SocketMonitor &m);
void AddIdle(IdleMonitor &i); void AddIdle(IdleMonitor &i);
......
...@@ -152,6 +152,19 @@ SocketMonitor::Steal() ...@@ -152,6 +152,19 @@ SocketMonitor::Steal()
} }
void void
SocketMonitor::Abandon()
{
assert(IsDefined());
#ifdef USE_EPOLL
fd = -1;
loop.Abandon(*this);
#else
Steal();
#endif
}
void
SocketMonitor::Close() SocketMonitor::Close()
{ {
close_socket(Steal()); close_socket(Steal());
......
...@@ -118,6 +118,11 @@ public: ...@@ -118,6 +118,11 @@ public:
*/ */
int Steal(); int Steal();
/**
* Somebody has closed the socket. Unregister this object.
*/
void Abandon();
void Close(); void Close();
unsigned GetScheduledFlags() const { unsigned GetScheduledFlags() const {
......
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