Refactor DetermineSleepTime() to use milliseconds.
authorThomas Munro <tmunro@postgresql.org>
Thu, 12 Jan 2023 02:04:08 +0000 (15:04 +1300)
committerThomas Munro <tmunro@postgresql.org>
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 */ );