Skip to content

Commit

Permalink
coap_io.c: Further cleanup of timeout checking code
Browse files Browse the repository at this point in the history
Fixes issue caused by #1314 found during testing.

Code re-worked to make more readable for flow checking.
  • Loading branch information
mrdeep1 committed Feb 15, 2024
1 parent 852d737 commit 9510cf9
Showing 1 changed file with 17 additions and 16 deletions.
33 changes: 17 additions & 16 deletions src/coap_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1561,9 +1561,6 @@ coap_io_process_with_fds(coap_context_t *ctx, uint32_t timeout_ms,
timeout = coap_io_prepare_io(ctx, ctx->sockets,
(sizeof(ctx->sockets) / sizeof(ctx->sockets[0])),
&ctx->num_sockets, before);
if (timeout_ms != COAP_IO_NO_WAIT && timeout_ms != COAP_IO_WAIT &&
timeout_ms < timeout)
timeout = timeout_ms;

if (ereadfds) {
ctx->readfds = *ereadfds;
Expand Down Expand Up @@ -1604,8 +1601,11 @@ coap_io_process_with_fds(coap_context_t *ctx, uint32_t timeout_ms,
tv.tv_usec = 0;
tv.tv_sec = 0;
timeout = 1;
} else if (timeout > 0) {
/* Ignore timeout_ms == COAP_IO_WAIT as there is something coming up */
} else if (timeout == 0 && timeout_ms == COAP_IO_WAIT) {
;
} else {
if (timeout == 0 || timeout_ms < timeout)
timeout = timeout_ms;
tv.tv_usec = (timeout % 1000) * 1000;
tv.tv_sec = (long)(timeout / 1000);
}
Expand Down Expand Up @@ -1674,13 +1674,9 @@ coap_io_process_with_fds(coap_context_t *ctx, uint32_t timeout_ms,

timeout = coap_io_prepare_epoll(ctx, before);

if (timeout_ms != COAP_IO_NO_WAIT && timeout_ms != COAP_IO_WAIT &&
timeout_ms < timeout)
timeout = timeout_ms;

do {
struct epoll_event events[COAP_MAX_EPOLL_EVENTS];
int etimeout = timeout;
int etimeout;

/* Potentially adjust based on what the caller wants */
if (timeout_ms == COAP_IO_NO_WAIT) {
Expand All @@ -1692,12 +1688,17 @@ coap_io_process_with_fds(coap_context_t *ctx, uint32_t timeout_ms,
* so wait forever in epoll_wait().
*/
etimeout = -1;
} else if (etimeout < 0) {
/*
* If timeout > INT_MAX, epoll_wait() cannot wait longer than this as
* it has int timeout parameter
*/
etimeout = INT_MAX;
} else {
etimeout = timeout;
if (timeout == 0 || timeout_ms < timeout)
etimeout = timeout_ms;
if (etimeout < 0) {
/*
* If timeout > INT_MAX, epoll_wait() cannot wait longer than this as
* it has int timeout parameter
*/
etimeout = INT_MAX;
}
}

/* Unlock so that other threads can lock/update ctx */
Expand Down

0 comments on commit 9510cf9

Please sign in to comment.