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;) {
}
#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) {
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--;
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);
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)
{
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);