]> PatchyGit - patchyircd.git/commitdiff
netpoll: close sockets in the uv_close callback
authorEgor <egor@patchysicp.xyz>
Mon, 17 Mar 2025 17:33:53 +0000 (19:33 +0200)
committerEgor <egor@patchysicp.xyz>
Mon, 17 Mar 2025 18:20:10 +0000 (20:20 +0200)
src/main.cpp
src/net.cpp
src/netpoll.cpp
src/netpoll.h

index e5cb301..0f1dd15 100644 (file)
@@ -300,8 +300,7 @@ int main(int argc, char *argv[])
                if (is_siginted) {
                        fprintf(stderr, "[PatchyIRCD]: Cleaning up...\n");
                        for (int i = 0; i < listener_count; i++) {
-                               net_poll_del(listeners[i].sock);
-                               closesocket(listeners[i].sock);
+                               net_poll_del_and_close(listeners[i].sock);
                        }
                        listener_count = 0;
                        for (struct client_data *cl = clients; cl;) {
index 78d0fab..b8b2fa9 100644 (file)
@@ -112,8 +112,7 @@ void killConnectionPart2(struct client_data *cl)
                }
 #endif
                shutdown(cl->FD, SHUT_RDWR);
-               net_poll_del(cl->FD);
-               closesocket(cl->FD);
+               net_poll_del_and_close(cl->FD);
        }
        /* Remove the client from the dyingclients chain */
        for (struct client_data **next = &dyingclients; *next; next = &(*next)->next) {
index 545a969..aae80a6 100644 (file)
@@ -281,7 +281,9 @@ static void net_poll_del_impl(int i)
        struct polldata *poll = uvpoll[i];
        memmove(uvpoll+i, uvpoll+i+1, sizeof(uvpoll[0])*(nfds-(i+1)));
        uv_close((uv_handle_t *)&poll->uv, [](uv_handle_t *handle){
-               uvalloc::put(container_of(handle, struct polldata, uv));
+               struct polldata *p = container_of(handle, struct polldata, uv);
+               closesocket(p->fd);
+               uvalloc::put(p);
        });
        if (lastptr > i)
                lastptr--;
@@ -370,15 +372,15 @@ void net_poll_add(SOCKET fd, int type, void *assoc)
        REF(fds[i]) = (struct net_pollfd){ .assoc = assoc, .fd = fd, .type = type };
        net_poll_add_impl(i);
 }
-void net_poll_del(SOCKET fd)
+void net_poll_del_and_close(SOCKET fd)
 {
        if (fd == INVALID_SOCKET) {
-               fprintf(stderr, "net_poll_del: INVALID_SOCKET\n");
+               fprintf(stderr, "net_poll_del_and_close: INVALID_SOCKET\n");
                abort();
        }
        int i = search(fd);
        if (!IS_FOUND(i, fd)) {
-               fprintf(stderr, "net_poll_del: socket not added\n");
+               fprintf(stderr, "net_poll_del_and_close: socket not added\n");
                abort();
        }
        net_poll_reg_impl(i, 0);
@@ -387,6 +389,9 @@ void net_poll_del(SOCKET fd)
        memmove(fds+i, fds+i+1, sizeof(fds[0])*(nfds-(i+1)));
        nfds--;
        fds[nfds] = t;
+#ifndef NETPOLL_USE_LIBUV
+       closesocket(fd);
+#endif
 }
 void net_poll_reg(SOCKET fd, int ev)
 {
index 4a92d44..e4420ec 100644 (file)
@@ -9,7 +9,7 @@ struct net_pollfd {
 void net_poll_init(void);
 void net_poll_fini(void);
 void net_poll_add(SOCKET fd, int type, void *assoc);
-void net_poll_del(SOCKET fd);
+void net_poll_del_and_close(SOCKET fd);
 void net_poll_reg(SOCKET fd, int ev);
 void net_poll_change_type(SOCKET fd, int type);
 int net_poll_begin(void);