size_t bytes_written = 0;
unsigned char *ptr = (unsigned char *) buf;
struct timeval start, delta, now, end = {0, 0};
+ int started = 0;
fd_set fds;
int result;
/* Loop until we have written the requested number of bytes. */
while (bytes_written < count) {
- /* Wait until space is available. */
- if (timeout_ms) {
+ /*
+ * Check timeout only if we have run select() at least once,
+ * to avoid any issues if a short timeout is reached before
+ * select() is even run.
+ */
+ if (timeout_ms && started) {
gettimeofday(&now, NULL);
if (timercmp(&now, &end, >))
/* Timeout has expired. */
timersub(&end, &now, &delta);
}
result = select(port->fd + 1, NULL, &fds, NULL, timeout_ms ? &delta : NULL);
+ started = 1;
if (result < 0) {
if (errno == EINTR) {
DEBUG("select() call was interrupted, repeating");
size_t bytes_read = 0;
unsigned char *ptr = (unsigned char *) buf;
struct timeval start, delta, now, end = {0, 0};
+ int started = 0;
fd_set fds;
int result;
/* Loop until we have the requested number of bytes. */
while (bytes_read < count) {
- /* Wait until data is available. */
- if (timeout_ms) {
+ /*
+ * Check timeout only if we have run select() at least once,
+ * to avoid any issues if a short timeout is reached before
+ * select() is even run.
+ */
+ if (timeout_ms && started) {
gettimeofday(&now, NULL);
if (timercmp(&now, &end, >))
/* Timeout has expired. */
timersub(&end, &now, &delta);
}
result = select(port->fd + 1, &fds, NULL, NULL, timeout_ms ? &delta : NULL);
+ started = 1;
if (result < 0) {
if (errno == EINTR) {
DEBUG("select() call was interrupted, repeating");
if (result < 0) {
if (errno == EAGAIN)
- /* This shouldn't happen because we did a select() first, but handle anyway. */
+ /*
+ * This shouldn't happen because we did a
+ * select() first, but handle anyway.
+ */
continue;
else
/* This is an actual failure. */
RETURN_OK();
#else
struct timeval start, delta, now, end = {0, 0};
+ int started = 0;
int result, timeout_remaining_ms;
struct pollfd *pollfds;
unsigned int i;
/* Loop until an event occurs. */
while (1) {
- if (timeout_ms) {
+ /*
+ * Check timeout only if we have run poll() at least once,
+ * to avoid any issues if a short timeout is reached before
+ * poll() is even run.
+ */
+ if (timeout_ms && started) {
gettimeofday(&now, NULL);
if (timercmp(&now, &end, >)) {
DEBUG("Wait timed out");
}
result = poll(pollfds, event_set->count, timeout_ms ? timeout_remaining_ms : -1);
+ started = 1;
if (result < 0) {
if (errno == EINTR) {