aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/port/unix_latch.c20
-rw-r--r--src/backend/port/win32_latch.c9
2 files changed, 19 insertions, 10 deletions
diff --git a/src/backend/port/unix_latch.c b/src/backend/port/unix_latch.c
index 147e22cee4e..90ec4f81d9e 100644
--- a/src/backend/port/unix_latch.c
+++ b/src/backend/port/unix_latch.c
@@ -460,7 +460,8 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
result |= WL_SOCKET_WRITEABLE;
}
if ((wakeEvents & WL_POSTMASTER_DEATH) &&
- FD_ISSET(postmaster_alive_fds[POSTMASTER_FD_WATCH], &input_mask))
+ FD_ISSET(postmaster_alive_fds[POSTMASTER_FD_WATCH],
+ &input_mask))
{
/*
* According to the select(2) man page on Linux, select(2) may
@@ -479,17 +480,22 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
#endif /* HAVE_POLL */
/* If we're not done, update cur_timeout for next iteration */
- if (result == 0 && cur_timeout >= 0)
+ if (result == 0 && (wakeEvents & WL_TIMEOUT))
{
INSTR_TIME_SET_CURRENT(cur_time);
INSTR_TIME_SUBTRACT(cur_time, start_time);
cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time);
- if (cur_timeout < 0)
- cur_timeout = 0;
-
+ if (cur_timeout <= 0)
+ {
+ /* Timeout has expired, no need to continue looping */
+ result |= WL_TIMEOUT;
+ }
#ifndef HAVE_POLL
- tv.tv_sec = cur_timeout / 1000L;
- tv.tv_usec = (cur_timeout % 1000L) * 1000L;
+ else
+ {
+ tv.tv_sec = cur_timeout / 1000L;
+ tv.tv_usec = (cur_timeout % 1000L) * 1000L;
+ }
#endif
}
} while (result == 0);
diff --git a/src/backend/port/win32_latch.c b/src/backend/port/win32_latch.c
index ee9526245fd..0e3aaeec69e 100644
--- a/src/backend/port/win32_latch.c
+++ b/src/backend/port/win32_latch.c
@@ -265,13 +265,16 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
elog(ERROR, "unexpected return code from WaitForMultipleObjects(): %lu", rc);
/* If we're not done, update cur_timeout for next iteration */
- if (result == 0 && cur_timeout != INFINITE)
+ if (result == 0 && (wakeEvents & WL_TIMEOUT))
{
INSTR_TIME_SET_CURRENT(cur_time);
INSTR_TIME_SUBTRACT(cur_time, start_time);
cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time);
- if (cur_timeout < 0)
- cur_timeout = 0;
+ if (cur_timeout <= 0)
+ {
+ /* Timeout has expired, no need to continue looping */
+ result |= WL_TIMEOUT;
+ }
}
} while (result == 0);