Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Sleep 1 millisecond in poll() to avoid busy wait

I played around with this quite a bit. After trying some more complex
schemes, I found that what worked best is to just sleep 1 millisecond
between iterations. Though it's a very short time, it still completely
eliminates the busy wait condition, without hurting perf.

There code uses SleepEx(1, TRUE) to sleep. See this page for a good
discussion of why that is better than calling SwitchToThread, which
is what was used previously:
http://stackoverflow.com/questions/1383943/switchtothread-vs-sleep1

Note that calling SleepEx(0, TRUE) does *not* solve the busy wait.

The most striking case was when testing on a UNC share with a large repo,
on a single CPU machine. Without the fix, it took 4 minutes 15 seconds,
and with the fix it took just 1:08! I think it's because git-upload-pack's
busy wait was eating the CPU away from the git process that's doing the
real work. With multi-proc, the timing is not much different, but tons of
CPU time is still wasted, which can be a killer on a server that needs to
do bunch of other things.

I also tested the very fast local case, and didn't see any measurable
difference. On a big repo with 4500 files, the upload-pack took about 2
seconds with and without the fix.
  • Loading branch information...
commit 4451dbf45209f6d0d7363b95f0e4e0cc592a19f8 1 parent 988d7fc
@theoleblond theoleblond authored
Showing with 3 additions and 1 deletion.
  1. +3 −1 compat/win32/poll.c
View
4 compat/win32/poll.c
@@ -597,7 +597,9 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout)
if (!rc && timeout == INFTIM)
{
- SwitchToThread();
+ /* Sleep 1 millisecond to avoid busy wait */
+ SleepEx(1, TRUE);
+
goto restart;
}
Please sign in to comment.
Something went wrong with that request. Please try again.