Refactor DetermineSleepTime() to use milliseconds.
authorThomas Munro <[email protected]>
Thu, 12 Jan 2023 02:04:08 +0000 (15:04 +1300)
committerThomas Munro <[email protected]>
Thu, 12 Jan 2023 03:32:30 +0000 (16:32 +1300)
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

src/backend/postmaster/postmaster.c

index ac0102b4861754a1eb8c9759b745fac8f2a97e06..9cedc1b9f0d50ea414cc8dd24d8de1e619b159ff 100644 (file)
@@ -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 */ );