Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
mmap(win32): avoid expensive fstat() call
author
Johannes Schindelin
<johannes.schindelin@gmx.de>
Fri, 22 Apr 2016 14:31:32 +0000
(16:31 +0200)
committer
Junio C Hamano
<gitster@pobox.com>
Fri, 22 Apr 2016 22:01:16 +0000
(15:01 -0700)
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>
compat/win32mmap.c
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (parent:
7ce7ee2
)
diff --git
a/compat/win32mmap.c
b/compat/win32mmap.c
index b836169b3ce88d2967b52fa4e3a697f895dc1a13..519d51f2b60a2dd0d477863f237e87b1beae1627 100644
(file)
--- 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)
{
void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
{
- HANDLE hmap;
+ HANDLE
osfhandle,
hmap;
void *temp;
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;
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");
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");
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) {
prot == PROT_READ ? PAGE_READONLY : PAGE_WRITECOPY, 0, 0, NULL);
if (!hmap) {