patch 7.4.1667
Problem: Win32: waiting on a pipe with fixed sleep time.
Solution: Start with a short delay and increase it when looping.
diff --git a/src/channel.c b/src/channel.c
index a506598..70c4413 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -2371,8 +2371,9 @@
if (fd != channel->CH_SOCK_FD)
{
DWORD nread;
- int diff;
+ int sleep_time;
DWORD deadline = GetTickCount() + timeout;
+ int delay = 1;
/* reading from a pipe, not a socket */
while (TRUE)
@@ -2380,12 +2381,17 @@
if (PeekNamedPipe((HANDLE)fd, NULL, 0, NULL, &nread, NULL)
&& nread > 0)
return OK;
- diff = deadline - GetTickCount();
- if (diff <= 0)
+ sleep_time = deadline - GetTickCount();
+ if (sleep_time <= 0)
break;
- /* Wait for 5 msec.
- * TODO: increase the sleep time when looping more often */
- Sleep(5);
+ /* Wait for a little while. Very short at first, up to 10 msec
+ * after looping a few times. */
+ if (sleep_time > delay)
+ sleep_time = delay;
+ Sleep(sleep_time);
+ delay = delay * 2;
+ if (delay > 10)
+ delay = 10;
}
}
else