Merge pull request #3690 from libgit2/cmn/pool-limit

win32: choose the page size as our value for the page size
This commit is contained in:
Edward Thomson 2016-03-16 14:12:14 -07:00
commit de143efa88
5 changed files with 41 additions and 9 deletions

View File

@ -449,7 +449,7 @@ static void hash_partially(git_indexer *idx, const uint8_t *data, size_t size)
static int write_at(git_indexer *idx, const void *data, git_off_t offset, size_t size) static int write_at(git_indexer *idx, const void *data, git_off_t offset, size_t size)
{ {
git_file fd = idx->pack->mwf.fd; git_file fd = idx->pack->mwf.fd;
size_t page_size; size_t mmap_alignment;
size_t page_offset; size_t page_offset;
git_off_t page_start; git_off_t page_start;
unsigned char *map_data; unsigned char *map_data;
@ -458,11 +458,11 @@ static int write_at(git_indexer *idx, const void *data, git_off_t offset, size_t
assert(data && size); assert(data && size);
if ((error = git__page_size(&page_size)) < 0) if ((error = git__mmap_alignment(&mmap_alignment)) < 0)
return error; return error;
/* the offset needs to be at the beginning of the a page boundary */ /* the offset needs to be at the mmap boundary for the platform */
page_offset = offset % page_size; page_offset = offset % mmap_alignment;
page_start = offset - page_offset; page_start = offset - page_offset;
if ((error = p_mmap(&map, page_offset + size, GIT_PROT_WRITE, GIT_MAP_SHARED, fd, page_start)) < 0) if ((error = p_mmap(&map, page_offset + size, GIT_PROT_WRITE, GIT_MAP_SHARED, fd, page_start)) < 0)

View File

@ -224,6 +224,13 @@ int git__page_size(size_t *page_size)
return 0; return 0;
} }
int git__mmap_alignment(size_t *alignment)
{
/* dummy; here we don't need any alignment anyway */
*alignment = 4096;
return 0;
}
int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset) int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset)
{ {

View File

@ -109,6 +109,7 @@ extern int p_getcwd(char *buffer_out, size_t size);
extern int p_rename(const char *from, const char *to); extern int p_rename(const char *from, const char *to);
extern int git__page_size(size_t *page_size); extern int git__page_size(size_t *page_size);
extern int git__mmap_alignment(size_t *page_size);
/** /**
* Platform-dependent methods * Platform-dependent methods

View File

@ -24,6 +24,11 @@ int git__page_size(size_t *page_size)
return 0; return 0;
} }
int git__mmap_alignment(size_t *alignment)
{
return git__page_size(alignment);
}
int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset) int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset)
{ {
int mprot = PROT_READ; int mprot = PROT_READ;

View File

@ -17,22 +17,41 @@ static DWORD get_page_size(void)
if (!page_size) { if (!page_size) {
GetSystemInfo(&sys); GetSystemInfo(&sys);
page_size = sys.dwAllocationGranularity; page_size = sys.dwPageSize;
} }
return page_size; return page_size;
} }
static DWORD get_allocation_granularity(void)
{
static DWORD granularity;
SYSTEM_INFO sys;
if (!granularity) {
GetSystemInfo(&sys);
granularity = sys.dwAllocationGranularity;
}
return granularity;
}
int git__page_size(size_t *page_size) int git__page_size(size_t *page_size)
{ {
*page_size = get_page_size(); *page_size = get_page_size();
return 0; return 0;
} }
int git__mmap_alignment(size_t *page_size)
{
*page_size = get_allocation_granularity();
return 0;
}
int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset) int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset)
{ {
HANDLE fh = (HANDLE)_get_osfhandle(fd); HANDLE fh = (HANDLE)_get_osfhandle(fd);
DWORD page_size = get_page_size(); DWORD alignment = get_allocation_granularity();
DWORD fmap_prot = 0; DWORD fmap_prot = 0;
DWORD view_prot = 0; DWORD view_prot = 0;
DWORD off_low = 0; DWORD off_low = 0;
@ -62,12 +81,12 @@ int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offs
if (prot & GIT_PROT_READ) if (prot & GIT_PROT_READ)
view_prot |= FILE_MAP_READ; view_prot |= FILE_MAP_READ;
page_start = (offset / page_size) * page_size; page_start = (offset / alignment) * alignment;
page_offset = offset - page_start; page_offset = offset - page_start;
if (page_offset != 0) { /* offset must be multiple of page size */ if (page_offset != 0) { /* offset must be multiple of the allocation granularity */
errno = EINVAL; errno = EINVAL;
giterr_set(GITERR_OS, "Failed to mmap. Offset must be multiple of page size"); giterr_set(GITERR_OS, "Failed to mmap. Offset must be multiple of allocation granularity");
return -1; return -1;
} }