Win32: add a cache below mingw's lstat and dirent implementations
commitd02af3a6811f5f4b90c9edd508c2e9246fcd0e14
authorKarsten Blees <blees@dcon.de>
Tue, 1 Oct 2013 10:51:54 +0000 (1 12:51 +0200)
committerJohannes Schindelin <johannes.schindelin@gmx.de>
Mon, 17 Feb 2014 18:42:34 +0000 (17 12:42 -0600)
tree3dc3c0c0f38dd4edde360207a474dcef02eec91c
parent4c9da8f5f2e2d76571bb2ddd357b81c7609d9548
Win32: add a cache below mingw's lstat and dirent implementations

Checking the work tree status is quite slow on Windows, due to slow lstat
emulation (git calls lstat once for each file in the index). Windows
operating system APIs seem to be much better at scanning the status
of entire directories than checking single files.

Add an lstat implementation that uses a cache for lstat data. Cache misses
read the entire parent directory and add it to the cache. Subsequent lstat
calls for the same directory are served directly from the cache.

Also implement opendir / readdir / closedir so that they create and use
directory listings in the cache.

The cache doesn't track file system changes and doesn't plug into any
modifying file APIs, so it has to be explicitly enabled for git functions
that don't modify the working copy.

Note: in an earlier version of this patch, the cache was always active and
tracked file system changes via ReadDirectoryChangesW. However, this was
much more complex and had negative impact on the performance of modifying
git commands such as 'git checkout'.

Signed-off-by: Karsten Blees <blees@dcon.de>
compat/win32/fscache.c [new file with mode: 0644]
compat/win32/fscache.h [new file with mode: 0644]
config.mak.uname
git-compat-util.h