-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add USE_WIN32_MMAP which triggers the use of windows' native file memory mapping functionality in git_mmap()/git_munmap() functions. As git functions currently use mmap with MAP_PRIVATE set only, this implementation supports only that mode for now. On Windows, offsets for memory mapped files need to match the allocation granularity. Take this into account when calculating the packed git- windowsize and file offsets. At the moment, the only function which makes use of offsets in conjunction with mmap is use_pack() in sha1-file.c. Git fast-import's code path tries to map a portion of the temporary packfile that exceeds the current filesize, i.e. offset+length is greater than the filesize. The NO_MMAP code worked with that since pread() just reads the file content until EOF and returns gracefully, while MapViewOfFile() aborts the mapping and returns 'Access Denied'. Working around that by determining the filesize and adjusting the length parameter. Signed-off-by: Janos Laube <janos.dev@gmail.com> Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
Janos Laube
authored and
Junio C Hamano
committed
Mar 19, 2009
1 parent
1c192f3
commit b130a72
Showing
4 changed files
with
73 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
#include "../git-compat-util.h" | ||
|
||
/* | ||
* Note that this doesn't return the actual pagesize, but | ||
* the allocation granularity. If future Windows specific git code | ||
* needs the real getpagesize function, we need to find another solution. | ||
*/ | ||
int mingw_getpagesize(void) | ||
{ | ||
SYSTEM_INFO si; | ||
GetSystemInfo(&si); | ||
return si.dwAllocationGranularity; | ||
} | ||
|
||
void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) | ||
{ | ||
HANDLE hmap; | ||
void *temp; | ||
size_t len; | ||
struct stat st; | ||
uint64_t o = offset; | ||
uint32_t l = o & 0xFFFFFFFF; | ||
uint32_t h = (o >> 32) & 0xFFFFFFFF; | ||
|
||
if (!fstat(fd, &st)) | ||
len = xsize_t(st.st_size); | ||
else | ||
die("mmap: could not determine filesize"); | ||
|
||
if ((length + offset) > len) | ||
length = len - offset; | ||
|
||
if (!(flags & MAP_PRIVATE)) | ||
die("Invalid usage of mmap when built with USE_WIN32_MMAP"); | ||
|
||
hmap = CreateFileMapping((HANDLE)_get_osfhandle(fd), 0, PAGE_WRITECOPY, | ||
0, 0, 0); | ||
|
||
if (!hmap) | ||
return MAP_FAILED; | ||
|
||
temp = MapViewOfFileEx(hmap, FILE_MAP_COPY, h, l, length, start); | ||
|
||
if (!CloseHandle(hmap)) | ||
warning("unable to close file mapping handle\n"); | ||
|
||
return temp ? temp : MAP_FAILED; | ||
} | ||
|
||
int git_munmap(void *start, size_t length) | ||
{ | ||
return !UnmapViewOfFile(start); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters