diff options
author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2016-04-22 16:31:32 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-04-22 15:01:16 -0700 |
commit | d5425d10ca68a297061f87f4460dd7e0b32b39a6 (patch) | |
tree | fb764715cbda50406df7e55dc86100a8aca47266 /compat | |
parent | mmap(win32): avoid copy-on-write when it is unnecessary (diff) | |
download | tgif-d5425d10ca68a297061f87f4460dd7e0b32b39a6.tar.xz |
mmap(win32): avoid expensive fstat() call
On Windows, we have to emulate the fstat() call to fill out information
that takes extra effort to obtain, such as the file permissions/type.
If all we want is the file size, we can use the much cheaper
GetFileSizeEx() function (available since Windows XP).
Suggested by Philip Kelley.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat')
-rw-r--r-- | compat/win32mmap.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/compat/win32mmap.c b/compat/win32mmap.c index b836169b3c..519d51f2b6 100644 --- a/compat/win32mmap.c +++ b/compat/win32mmap.c @@ -2,26 +2,24 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) { - HANDLE hmap; + HANDLE osfhandle, hmap; void *temp; - off_t len; - struct stat st; + LARGE_INTEGER len; uint64_t o = offset; uint32_t l = o & 0xFFFFFFFF; uint32_t h = (o >> 32) & 0xFFFFFFFF; - if (!fstat(fd, &st)) - len = st.st_size; - else + osfhandle = (HANDLE)_get_osfhandle(fd); + if (!GetFileSizeEx(osfhandle, &len)) die("mmap: could not determine filesize"); - if ((length + offset) > len) - length = xsize_t(len - offset); + if ((length + offset) > len.QuadPart) + length = xsize_t(len.QuadPart - offset); if (!(flags & MAP_PRIVATE)) die("Invalid usage of mmap when built with USE_WIN32_MMAP"); - hmap = CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL, + hmap = CreateFileMapping(osfhandle, NULL, prot == PROT_READ ? PAGE_READONLY : PAGE_WRITECOPY, 0, 0, NULL); if (!hmap) { |