Skip to content

Commit

Permalink
mmap(win32): avoid expensive fstat() call
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
dscho committed Apr 4, 2016
1 parent 8e48180 commit fc348ad
Showing 1 changed file with 7 additions and 9 deletions.
16 changes: 7 additions & 9 deletions compat/win32mmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit fc348ad

Please sign in to comment.