summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro2023-01-12 02:04:08 +0000
committerThomas Munro2023-01-12 03:32:30 +0000
commit5a26c7b310b629f8893483cc3cce5bbfa7879115 (patch)
treebd8f0e2494e38c45b2e1fb99c1dfc835fc6e0793
parent7389aad63666a2cac18cd6d7496378d7f50ef37b (diff)
Refactor DetermineSleepTime() to use milliseconds.
Since we're not using select() anymore, we don't need to bother with struct timeval. We can work directly in milliseconds, which the latch API wants. Discussion: https://postgr.es/m/CA%2BhUKG%2BZ-HpOj1JsO9eWUP%2Bar7npSVinsC_npxSy%2BjdOMsx%3DGg%40mail.gmail.com
-rw-r--r--src/backend/postmaster/postmaster.c57
1 files changed, 18 insertions, 39 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index ac0102b4861..9cedc1b9f0d 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -1586,7 +1586,7 @@ checkControlFile(void)
}
/*
- * Determine how long should we let ServerLoop sleep.
+ * Determine how long should we let ServerLoop sleep, in milliseconds.
*
* In normal conditions we wait at most one minute, to ensure that the other
* background tasks handled by ServerLoop get done even when no requests are
@@ -1594,8 +1594,8 @@ checkControlFile(void)
* we don't actually sleep so that they are quickly serviced. Other exception
* cases are as shown in the code.
*/
-static void
-DetermineSleepTime(struct timeval *timeout)
+static int
+DetermineSleepTime(void)
{
TimestampTz next_wakeup = 0;
@@ -1608,26 +1608,20 @@ DetermineSleepTime(struct timeval *timeout)
{
if (AbortStartTime != 0)
{
+ int seconds;
+
/* time left to abort; clamp to 0 in case it already expired */
- timeout->tv_sec = SIGKILL_CHILDREN_AFTER_SECS -
+ seconds = SIGKILL_CHILDREN_AFTER_SECS -
(time(NULL) - AbortStartTime);
- timeout->tv_sec = Max(timeout->tv_sec, 0);
- timeout->tv_usec = 0;
+
+ return Max(seconds * 1000, 0);
}
else
- {
- timeout->tv_sec = 60;
- timeout->tv_usec = 0;
- }
- return;
+ return 60 * 1000;
}
if (StartWorkerNeeded)
- {
- timeout->tv_sec = 0;
- timeout->tv_usec = 0;
- return;
- }
+ return 0;
if (HaveCrashedWorker)
{
@@ -1665,26 +1659,14 @@ DetermineSleepTime(struct timeval *timeout)
if (next_wakeup != 0)
{
- long secs;
- int microsecs;
-
- TimestampDifference(GetCurrentTimestamp(), next_wakeup,
- &secs, &microsecs);
- timeout->tv_sec = secs;
- timeout->tv_usec = microsecs;
-
- /* Ensure we don't exceed one minute */
- if (timeout->tv_sec > 60)
- {
- timeout->tv_sec = 60;
- timeout->tv_usec = 0;
- }
- }
- else
- {
- timeout->tv_sec = 60;
- timeout->tv_usec = 0;
+ /* Ensure we don't exceed one minute, or go under 0. */
+ return Max(0,
+ Min(60 * 1000,
+ TimestampDifferenceMilliseconds(GetCurrentTimestamp(),
+ next_wakeup)));
}
+
+ return 60 * 1000;
}
/*
@@ -1743,12 +1725,9 @@ ServerLoop(void)
for (;;)
{
time_t now;
- struct timeval timeout;
-
- DetermineSleepTime(&timeout);
nevents = WaitEventSetWait(pm_wait_set,
- timeout.tv_sec * 1000 + timeout.tv_usec / 1000,
+ DetermineSleepTime(),
events,
lengthof(events),
0 /* postmaster posts no wait_events */ );