git-commit-vandalism/compat
Theodore Leblond 76e7c8a7ed compat/poll: sleep 1 millisecond to avoid busy wait
SwitchToThread() only gives away the rest of the current time slice
to another thread in the current process. So if the thread that feeds
the file decscriptor we're polling is not in the current process, we
get busy-waiting.

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.

[jc: this was first accepted in msysgit tree in May 2012 via a pull
request and Paolo Bonzini has also accepted the same fix to Gnulib
around the same time; see $gmane/247518 for a bit more detail]

Signed-off-by: Stepan Kasal <kasal@ucw.cz>
Acked-by: Johannes Sixt <j6t@kdbg.org>
Acked-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-04-29 09:55:38 -07:00
..
fnmatch compat/fnmatch/fnmatch.c: Fix a sparse error 2013-04-28 12:24:40 -07:00
nedmalloc Windows: do not redefine _WIN32_WINNT 2013-09-11 14:50:19 -07:00
poll compat/poll: sleep 1 millisecond to avoid busy wait 2014-04-29 09:55:38 -07:00
regex C: have space around && and || operators 2013-10-16 10:26:39 -07:00
vcbuild mark Windows build scripts executable 2013-11-25 15:01:22 -08:00
win32 compat/win32/pthread.c: Fix a sparse warning 2013-04-28 12:26:45 -07:00
apple-common-crypto.h imap-send: use Apple's Security framework for base64 encoding 2013-07-30 08:53:24 -07:00
basename.c compat: add a basename() compatibility function 2009-05-31 17:57:59 -07:00
bswap.h compat: make gcc bswap an inline function 2011-03-16 12:44:59 -07:00
fopen.c
gmtime.c date: recognize bogus FreeBSD gmtime output 2014-04-01 14:39:04 -07:00
hstrerror.c
inet_ntop.c Drop system includes from inet_pton/inet_ntop compatibility wrappers 2012-02-05 16:32:33 -08:00
inet_pton.c Drop system includes from inet_pton/inet_ntop compatibility wrappers 2012-02-05 16:32:33 -08:00
memmem.c
mingw.c mingw: remove mingw_write 2014-01-17 12:09:52 -08:00
mingw.h mingw: remove mingw_write 2014-01-17 12:09:52 -08:00
mkdir.c compat: some mkdir() do not like a slash at the end 2012-08-24 09:48:51 -07:00
mkdtemp.c Fix gitmkdtemp: correct test for mktemp() return value 2010-02-25 12:08:22 -08:00
mmap.c
msvc.c win32: use our own dirent.h 2010-11-23 16:06:50 -08:00
msvc.h MSVC: fix stat definition hell 2013-09-11 11:08:52 -07:00
obstack.c obstack.c: Fix some sparse warnings 2011-09-11 14:43:33 -07:00
obstack.h obstack: fix spelling of similar 2013-04-12 12:23:20 -07:00
pread.c
precompose_utf8.c Set core.precomposeunicode to true on e.g. HFS+ 2013-08-27 07:41:32 -07:00
precompose_utf8.h git on Mac OS and precomposed unicode 2012-07-08 22:03:46 -07:00
qsort.c cleanup: use internal memory allocation wrapper functions everywhere 2011-10-06 13:54:32 -07:00
setenv.c compat/setenv.c: error if name contains '=' 2011-12-14 19:31:03 -08:00
snprintf.c compat/snprintf: don't look at va_list twice 2011-12-12 09:09:35 -08:00
strcasestr.c
strlcpy.c
strtoimax.c Add strtoimax() compatibility function. 2011-11-02 13:06:30 -07:00
strtoumax.c
terminal.c mingw: rename WIN32 cpp macro to GIT_WINDOWS_NATIVE 2013-05-08 12:14:35 -07:00
terminal.h add generic terminal prompt function 2011-12-12 16:09:38 -08:00
unsetenv.c Revert "compat/unsetenv.c: Fix a sparse warning" 2013-07-21 15:09:56 -07:00
win32.h mingw: rename WIN32 cpp macro to GIT_WINDOWS_NATIVE 2013-05-08 12:14:35 -07:00
win32mmap.c compat/win32mmap.c: Fix some sparse warnings 2013-04-28 12:27:08 -07:00
winansi.c Make usage of windows.h lean and mean 2009-09-18 20:00:42 -07:00