Commit 89d0dc01372c8648792f3d02b99d86d093755c31
1 parent
33d92434
Fix longstanding limitation of server to wait forever
The change for serial on Windows is temporary. If you're interested of improving the situation for this, please have a look at the FIXME.
Showing
2 changed files
with
17 additions
and
8 deletions
src/modbus-rtu.c
| ... | ... | @@ -193,10 +193,18 @@ static int win32_ser_select(struct win32_ser *ws, int max_len, |
| 193 | 193 | return 1; |
| 194 | 194 | } |
| 195 | 195 | |
| 196 | - /* Setup timeouts like select() would do */ | |
| 197 | - msec = tv->tv_sec * 1000 + tv->tv_usec / 1000; | |
| 198 | - if (msec < 1) | |
| 199 | - msec = 1; | |
| 196 | + /* Setup timeouts like select() would do. | |
| 197 | + FIXME Please someone on Windows can look at this? | |
| 198 | + Does it possible to use WaitCommEvent? | |
| 199 | + When tv is NULL, MAXDWORD isn't infinite! | |
| 200 | + */ | |
| 201 | + if (tv == NULL) { | |
| 202 | + msec = MAXDWORD; | |
| 203 | + } else { | |
| 204 | + msec = tv->tv_sec * 1000 + tv->tv_usec / 1000; | |
| 205 | + if (msec < 1) | |
| 206 | + msec = 1; | |
| 207 | + } | |
| 200 | 208 | |
| 201 | 209 | comm_to.ReadIntervalTimeout = msec; |
| 202 | 210 | comm_to.ReadTotalTimeoutMultiplier = 0; | ... | ... |
src/modbus.c
| ... | ... | @@ -302,6 +302,7 @@ static int receive_msg(modbus_t *ctx, uint8_t *msg, msg_type_t msg_type) |
| 302 | 302 | int rc; |
| 303 | 303 | fd_set rfds; |
| 304 | 304 | struct timeval tv; |
| 305 | + struct timeval *p_tv; | |
| 305 | 306 | int length_to_read; |
| 306 | 307 | int msg_length = 0; |
| 307 | 308 | _step_t step; |
| ... | ... | @@ -327,16 +328,15 @@ static int receive_msg(modbus_t *ctx, uint8_t *msg, msg_type_t msg_type) |
| 327 | 328 | if (msg_type == MSG_INDICATION) { |
| 328 | 329 | /* Wait for a message, we don't know when the message will be |
| 329 | 330 | * received */ |
| 330 | - /* FIXME Not infinite */ | |
| 331 | - tv.tv_sec = 60; | |
| 332 | - tv.tv_usec = 0; | |
| 331 | + p_tv = NULL; | |
| 333 | 332 | } else { |
| 334 | 333 | tv.tv_sec = ctx->response_timeout.tv_sec; |
| 335 | 334 | tv.tv_usec = ctx->response_timeout.tv_usec; |
| 335 | + p_tv = &tv; | |
| 336 | 336 | } |
| 337 | 337 | |
| 338 | 338 | while (length_to_read != 0) { |
| 339 | - rc = ctx->backend->select(ctx, &rfds, &tv, length_to_read); | |
| 339 | + rc = ctx->backend->select(ctx, &rfds, p_tv, length_to_read); | |
| 340 | 340 | if (rc == -1) { |
| 341 | 341 | return -1; |
| 342 | 342 | } |
| ... | ... | @@ -403,6 +403,7 @@ static int receive_msg(modbus_t *ctx, uint8_t *msg, msg_type_t msg_type) |
| 403 | 403 | byte_timeout */ |
| 404 | 404 | tv.tv_sec = ctx->byte_timeout.tv_sec; |
| 405 | 405 | tv.tv_usec = ctx->byte_timeout.tv_usec; |
| 406 | + p_tv = &tv; | |
| 406 | 407 | } |
| 407 | 408 | } |
| 408 | 409 | ... | ... |