From 275129c9d08b2d29529b2f9d039198168aeb52a7 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Tue, 17 Sep 2019 21:45:22 +0200 Subject: [PATCH] Call the poll callback with 0 whenever a connection is closed. --- utcp.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/utcp.c b/utcp.c index 3a29947..5dc7501 100644 --- a/utcp.c +++ b/utcp.c @@ -1195,6 +1195,10 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) { c->recv(c, NULL, 0); } + if(c->poll && !c->reapable) { + c->poll(c, 0); + } + return 0; case SYN_RECEIVED: @@ -1222,6 +1226,10 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) { c->recv(c, NULL, 0); } + if(c->poll && !c->reapable) { + c->poll(c, 0); + } + return 0; case CLOSING: @@ -1506,7 +1514,7 @@ skip_ack: c->rcv.nxt++; len++; - // Inform the application that the peer closed the connection. + // Inform the application that the peer closed its end of the connection. if(c->recv) { errno = 0; c->recv(c, NULL, 0); @@ -1685,6 +1693,7 @@ void utcp_abort_all_connections(struct utcp *utcp) { } utcp_recv_t old_recv = c->recv; + utcp_poll_t old_poll = c->poll; reset_connection(c); @@ -1692,6 +1701,11 @@ void utcp_abort_all_connections(struct utcp *utcp) { errno = 0; old_recv(c, NULL, 0); } + + if(old_poll && !c->reapable) { + errno = 0; + old_poll(c, 0); + } } return; @@ -1754,7 +1768,7 @@ struct timeval utcp_timeout(struct utcp *utcp) { c->recv(c, NULL, 0); } - if(c->poll) { + if(c->poll && !c->reapable) { c->poll(c, 0); } @@ -1838,11 +1852,16 @@ void utcp_exit(struct utcp *utcp) { for(int i = 0; i < utcp->nconnections; i++) { struct utcp_connection *c = utcp->connections[i]; - if(!c->reapable) + if(!c->reapable) { if(c->recv) { c->recv(c, NULL, 0); } + if(c->poll && !c->reapable) { + c->poll(c, 0); + } + } + buffer_exit(&c->rcvbuf); buffer_exit(&c->sndbuf); free(c); -- 2.39.2