From 18d13f98483e57b598307bbde3fa02c8b67c095d Mon Sep 17 00:00:00 2001 From: "Sergio R. Caprile" Date: Thu, 2 Nov 2023 18:27:39 -0300 Subject: [PATCH] Allow fast close --- mongoose.c | 4 ++++ src/sock.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/mongoose.c b/mongoose.c index 3cc1db61..8bc640fe 100644 --- a/mongoose.c +++ b/mongoose.c @@ -6823,6 +6823,7 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { if (can_read(c)) FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_READ | eSELECT_EXCEPT); if (can_write(c)) FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_WRITE); + if (c->is_closing) ms = 1; } FreeRTOS_select(mgr->ss, pdMS_TO_TICKS(ms)); for (c = mgr->conns; c != NULL; c = c->next) { @@ -6839,6 +6840,7 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { c->is_readable = c->is_writable = 0; if (mg_tls_pending(c) > 0) ms = 1, c->is_readable = 1; if (can_write(c)) MG_EPOLL_MOD(c, 1); + if (c->is_closing) ms = 1; max++; } struct epoll_event *evs = (struct epoll_event *) alloca(max * sizeof(evs[0])); @@ -6871,6 +6873,7 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { fds[n].fd = FD(c); if (can_read(c)) fds[n].events |= POLLIN; if (can_write(c)) fds[n].events |= POLLOUT; + if (c->is_closing) ms = 1; n++; } } @@ -6918,6 +6921,7 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { if (can_write(c)) FD_SET(FD(c), &wset); if (mg_tls_pending(c) > 0) tvp = &tv_zero; if (FD(c) > maxfd) maxfd = FD(c); + if (c->is_closing) ms = 1; } if ((rc = select((int) maxfd + 1, &rset, &wset, &eset, tvp)) < 0) { diff --git a/src/sock.c b/src/sock.c index b560a335..4774fe5d 100644 --- a/src/sock.c +++ b/src/sock.c @@ -442,6 +442,7 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { if (can_read(c)) FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_READ | eSELECT_EXCEPT); if (can_write(c)) FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_WRITE); + if (c->is_closing) ms = 1; } FreeRTOS_select(mgr->ss, pdMS_TO_TICKS(ms)); for (c = mgr->conns; c != NULL; c = c->next) { @@ -458,6 +459,7 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { c->is_readable = c->is_writable = 0; if (mg_tls_pending(c) > 0) ms = 1, c->is_readable = 1; if (can_write(c)) MG_EPOLL_MOD(c, 1); + if (c->is_closing) ms = 1; max++; } struct epoll_event *evs = (struct epoll_event *) alloca(max * sizeof(evs[0])); @@ -490,6 +492,7 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { fds[n].fd = FD(c); if (can_read(c)) fds[n].events |= POLLIN; if (can_write(c)) fds[n].events |= POLLOUT; + if (c->is_closing) ms = 1; n++; } } @@ -537,6 +540,7 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { if (can_write(c)) FD_SET(FD(c), &wset); if (mg_tls_pending(c) > 0) tvp = &tv_zero; if (FD(c) > maxfd) maxfd = FD(c); + if (c->is_closing) ms = 1; } if ((rc = select((int) maxfd + 1, &rset, &wset, &eset, tvp)) < 0) {