diff options
Diffstat (limited to 'extmod/modlwip.c')
| -rw-r--r-- | extmod/modlwip.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/extmod/modlwip.c b/extmod/modlwip.c index afac512e8..1ae8c114c 100644 --- a/extmod/modlwip.c +++ b/extmod/modlwip.c @@ -326,6 +326,10 @@ typedef struct _lwip_socket_obj_t { int8_t state; } lwip_socket_obj_t; +static inline bool socket_is_timedout(lwip_socket_obj_t *socket, mp_uint_t ticks_start) { + return socket->timeout != -1 && (mp_uint_t)(mp_hal_ticks_ms() - ticks_start) >= socket->timeout; +} + static inline void poll_sockets(void) { mp_event_wait_ms(1); } @@ -1130,21 +1134,21 @@ static mp_obj_t lwip_socket_connect(mp_obj_t self_in, mp_obj_t addr_in) { MICROPY_PY_LWIP_EXIT // And now we wait... - if (socket->timeout != -1) { - for (mp_uint_t retries = socket->timeout / 100; retries--;) { - mp_hal_delay_ms(100); - if (socket->state != STATE_CONNECTING) { - break; - } - } - if (socket->state == STATE_CONNECTING) { - mp_raise_OSError(MP_EINPROGRESS); + mp_uint_t ticks_start = mp_hal_ticks_ms(); + for (;;) { + poll_sockets(); + if (socket->state != STATE_CONNECTING) { + break; } - } else { - while (socket->state == STATE_CONNECTING) { - poll_sockets(); + if (socket_is_timedout(socket, ticks_start)) { + if (socket->timeout == 0) { + mp_raise_OSError(MP_EINPROGRESS); + } else { + mp_raise_OSError(MP_ETIMEDOUT); + } } } + if (socket->state == STATE_CONNECTED) { err = ERR_OK; } else { |
