summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2011-08-09 22:52:29 +0000
committerTom Lane2011-08-09 22:52:29 +0000
commit9f17ffd8660243382809b8023ff3d38fbfac4e8b (patch)
treef58c4fa6f2509bb157dcad8ad4223673ed55d383
parent4e15a4db5e65e43271f8d20750d6500ab12632d0 (diff)
Measure WaitLatch's timeout parameter in milliseconds, not microseconds.
The original definition had the problem that timeouts exceeding about 2100 seconds couldn't be specified on 32-bit machines. Milliseconds seem like sufficient resolution, and finer grain than that would be fantasy anyway on many platforms. Back-patch to 9.1 so that this aspect of the latch API won't change between 9.1 and later releases. Peter Geoghegan
-rw-r--r--src/backend/access/transam/xlog.c4
-rw-r--r--src/backend/port/unix_latch.c7
-rw-r--r--src/backend/port/win32_latch.c10
-rw-r--r--src/backend/postmaster/pgarch.c5
-rw-r--r--src/backend/replication/syncrep.c2
-rw-r--r--src/backend/replication/walsender.c2
6 files changed, 15 insertions, 15 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 6a6959f728..4d2bfdf4f1 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -10210,7 +10210,9 @@ retry:
/*
* Wait for more WAL to arrive, or timeout to be reached
*/
- WaitLatch(&XLogCtl->recoveryWakeupLatch, WL_LATCH_SET | WL_TIMEOUT, 5000000L);
+ WaitLatch(&XLogCtl->recoveryWakeupLatch,
+ WL_LATCH_SET | WL_TIMEOUT,
+ 5000L);
ResetLatch(&XLogCtl->recoveryWakeupLatch);
}
else
diff --git a/src/backend/port/unix_latch.c b/src/backend/port/unix_latch.c
index 950a3a4011..ff4ed8f16c 100644
--- a/src/backend/port/unix_latch.c
+++ b/src/backend/port/unix_latch.c
@@ -137,7 +137,7 @@ DisownLatch(volatile Latch *latch)
* to wait for. If the latch is already set (and WL_LATCH_SET is given), the
* function returns immediately.
*
- * The 'timeout' is given in microseconds. It must be >= 0 if WL_TIMEOUT flag
+ * The 'timeout' is given in milliseconds. It must be >= 0 if WL_TIMEOUT flag
* is given. On some platforms, signals cause the timeout to be restarted,
* so beware that the function can sleep for several times longer than the
* specified timeout.
@@ -156,6 +156,7 @@ DisownLatch(volatile Latch *latch)
* have been satisfied. That should be rare in practice, but the caller
* should not use the return value for anything critical, re-checking the
* situation with PostmasterIsAlive() or read() on a socket as necessary.
+ * The latch and timeout flag bits can be trusted, however.
*/
int
WaitLatch(volatile Latch *latch, int wakeEvents, long timeout)
@@ -191,8 +192,8 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
if (wakeEvents & WL_TIMEOUT)
{
Assert(timeout >= 0);
- tv.tv_sec = timeout / 1000000L;
- tv.tv_usec = timeout % 1000000L;
+ tv.tv_sec = timeout / 1000L;
+ tv.tv_usec = (timeout % 1000L) * 1000L;
tvp = &tv;
}
diff --git a/src/backend/port/win32_latch.c b/src/backend/port/win32_latch.c
index eeb85a96ce..10a4006701 100644
--- a/src/backend/port/win32_latch.c
+++ b/src/backend/port/win32_latch.c
@@ -99,7 +99,6 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
int numevents;
int result = 0;
int pmdeath_eventno = 0;
- long timeout_ms;
/* Ignore WL_SOCKET_* events if no valid socket is given */
if (sock == PGINVALID_SOCKET)
@@ -110,14 +109,11 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
if ((wakeEvents & WL_LATCH_SET) && latch->owner_pid != MyProcPid)
elog(ERROR, "cannot wait on a latch owned by another process");
- /* Convert timeout to milliseconds for WaitForMultipleObjects() */
+ /* Convert timeout to form used by WaitForMultipleObjects() */
if (wakeEvents & WL_TIMEOUT)
- {
Assert(timeout >= 0);
- timeout_ms = timeout / 1000;
- }
else
- timeout_ms = INFINITE;
+ timeout = INFINITE;
/* Construct an array of event handles for WaitforMultipleObjects() */
latchevent = latch->event;
@@ -165,7 +161,7 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
break;
}
- rc = WaitForMultipleObjects(numevents, events, FALSE, timeout_ms);
+ rc = WaitForMultipleObjects(numevents, events, FALSE, timeout);
if (rc == WAIT_FAILED)
elog(ERROR, "WaitForMultipleObjects() failed: error code %d", (int) GetLastError());
diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c
index 2070fbb375..8ccfc37fe9 100644
--- a/src/backend/postmaster/pgarch.c
+++ b/src/backend/postmaster/pgarch.c
@@ -406,10 +406,11 @@ pgarch_MainLoop(void)
timeout = PGARCH_AUTOWAKE_INTERVAL - (curtime - last_copy_time);
if (timeout > 0)
{
- int rc;
+ int rc;
+
rc = WaitLatch(&mainloop_latch,
WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
- timeout * 1000000L);
+ timeout * 1000L);
if (rc & WL_TIMEOUT)
wakened = true;
}
diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c
index 56af4237e8..7d7f340274 100644
--- a/src/backend/replication/syncrep.c
+++ b/src/backend/replication/syncrep.c
@@ -251,7 +251,7 @@ SyncRepWaitForLSN(XLogRecPtr XactCommitLSN)
* cancel/die signal or postmaster death regularly while waiting. Note
* that timeout here does not necessarily release from loop.
*/
- WaitLatch(&MyProc->waitLatch, WL_LATCH_SET | WL_TIMEOUT, 60000000L);
+ WaitLatch(&MyProc->waitLatch, WL_LATCH_SET | WL_TIMEOUT, 60000L);
}
/*
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 7f83a32c0c..27577529eb 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -812,7 +812,7 @@ WalSndLoop(void)
if (pq_is_send_pending())
wakeEvents |= WL_SOCKET_WRITEABLE;
WaitLatchOrSocket(&MyWalSnd->latch, wakeEvents,
- MyProcPort->sock, sleeptime * 1000L);
+ MyProcPort->sock, sleeptime);
/* Check for replication timeout */
if (replication_timeout > 0 &&