MEDIUM: fd: replace usages of fd_remove() with fd_stop_both()
We used to require fd_remove() to remove an FD from a poller when we
still had the FD cache and it was not possible to directly act on the
pollers. Nowadays we don't need this anymore as the pollers will
automatically unregister disabled FDs. The fd_remove() hack is
particularly problematic because it additionally hides the FD from
the known FD list and could make one think it's closed.
It's used at two places:
- with the async SSL engine
- with the listeners (when unbinding from an fd for another process)
Let's just use fd_stop_both() instead, which will propagate down the
stack to do the right thing, without removing the FD from the array
of known ones.
Now when dumping FDs using "show fd" on a process which still knows some
of the other workers' FDs, the FD will properly be listed with a listener
state equal to "ZOM" for "zombie". This guarantees that the FD is still
known and will properly be passed using _getsocks().
diff --git a/src/listener.c b/src/listener.c
index cad0e0c..6e635e3 100644
--- a/src/listener.c
+++ b/src/listener.c
@@ -503,13 +503,12 @@
MT_LIST_DEL(&listener->wait_queue);
if (listener->state >= LI_PAUSED) {
+ listener->state = LI_ASSIGNED;
+ fd_stop_both(listener->fd);
if (do_close) {
fd_delete(listener->fd);
listener->fd = -1;
}
- else
- fd_remove(listener->fd);
- listener->state = LI_ASSIGNED;
}
}