From 5903ee561c8e2fec7ecc8f08f221c27574090649 Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 7 Jun 2024 13:36:30 +1000 Subject: [PATCH] extmod/modlwip: Consolidate socket.accept timeout logic. This makes the code a bit simpler to understand for the three cases of timeout behaviour (-1, 0, non-zero), and eliminates a dependency on the (slow) `mp_hal_delay_ms(100)` call. Signed-off-by: Damien George --- extmod/modlwip.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/extmod/modlwip.c b/extmod/modlwip.c index 1ae8c114c..bcee3f0ff 100644 --- a/extmod/modlwip.c +++ b/extmod/modlwip.c @@ -1040,26 +1040,22 @@ static mp_obj_t lwip_socket_accept(mp_obj_t self_in) { // accept incoming connection struct tcp_pcb *volatile *incoming_connection = &lwip_socket_incoming_array(socket)[socket->incoming.connection.iget]; if (*incoming_connection == NULL) { - if (socket->timeout == 0) { + mp_uint_t ticks_start = mp_hal_ticks_ms(); + for (;;) { MICROPY_PY_LWIP_EXIT - m_del_obj(lwip_socket_obj_t, socket2); - mp_raise_OSError(MP_EAGAIN); - } else if (socket->timeout != -1) { - mp_uint_t retries = socket->timeout / 100; - while (*incoming_connection == NULL) { + poll_sockets(); + MICROPY_PY_LWIP_REENTER + if (*incoming_connection != NULL) { + break; + } + if (socket_is_timedout(socket, ticks_start)) { MICROPY_PY_LWIP_EXIT - if (retries-- == 0) { - m_del_obj(lwip_socket_obj_t, socket2); + m_del_obj(lwip_socket_obj_t, socket2); + if (socket->timeout == 0) { + mp_raise_OSError(MP_EAGAIN); + } else { mp_raise_OSError(MP_ETIMEDOUT); } - mp_hal_delay_ms(100); - MICROPY_PY_LWIP_REENTER - } - } else { - while (*incoming_connection == NULL) { - MICROPY_PY_LWIP_EXIT - poll_sockets(); - MICROPY_PY_LWIP_REENTER } } }