summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAngus Gratton <angus@redyak.com.au>2023-11-09 10:30:23 +1100
committerDamien George <damien@micropython.org>2023-11-20 19:16:16 +1100
commitfce8d9fd55409ab1027beee5671bc653fb5beb97 (patch)
tree3fa0aa6cc141009956c0bb0f42b9d1d648254e88
parent57cce79a46f6ab7e990a626251ca8f9d59cd095a (diff)
esp32/modsocket: Try garbage collection if the socket limit is reached.
If the hard socket limit (default 16) is reached then it's possible that socket allocation fails but garbage collection would allow it to succeed. Perform a GC pass and try again before giving up, similar to the logic elsewhere in MicroPython that tries a GC pass before raising MemoryError. This work was funded through GitHub Sponsors. Signed-off-by: Angus Gratton <angus@redyak.com.au>
-rw-r--r--ports/esp32/modsocket.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/ports/esp32/modsocket.c b/ports/esp32/modsocket.c
index cacc52dec..ca8c63030 100644
--- a/ports/esp32/modsocket.c
+++ b/ports/esp32/modsocket.c
@@ -36,6 +36,7 @@
#include <stdlib.h>
#include <string.h>
+#include "py/gc.h"
#include "py/runtime0.h"
#include "py/nlr.h"
#include "py/objlist.h"
@@ -274,6 +275,13 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
sock->state = sock->type == SOCK_STREAM ? SOCKET_STATE_NEW : SOCKET_STATE_CONNECTED;
sock->fd = lwip_socket(sock->domain, sock->type, sock->proto);
+ if (sock->fd < 0 && errno == ENFILE) {
+ // ESP32 LWIP has a hard socket limit, ENFILE is returned when this is
+ // reached. Similar to the logic elsewhere for MemoryError, try running
+ // GC before failing outright.
+ gc_collect();
+ sock->fd = lwip_socket(sock->domain, sock->type, sock->proto);
+ }
if (sock->fd < 0) {
mp_raise_OSError(errno);
}