Skip to content

win32: choose the page size as our value for the page size #3690

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 16, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/indexer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
git_file fd = idx->pack->mwf.fd;
size_t page_size;
size_t mmap_alignment;
size_t page_offset;
git_off_t page_start;
unsigned char *map_data;
Expand All @@ -458,11 +458,11 @@ static int write_at(git_indexer *idx, const void *data, git_off_t offset, size_t

assert(data && size);

if ((error = git__page_size(&page_size)) < 0)
if ((error = git__mmap_alignment(&mmap_alignment)) < 0)
return error;

/* the offset needs to be at the beginning of the a page boundary */
page_offset = offset % page_size;
/* the offset needs to be at the mmap boundary for the platform */
page_offset = offset % mmap_alignment;
page_start = offset - page_offset;

if ((error = p_mmap(&map, page_offset + size, GIT_PROT_WRITE, GIT_MAP_SHARED, fd, page_start)) < 0)
Expand Down
7 changes: 7 additions & 0 deletions src/posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,13 @@ int git__page_size(size_t *page_size)
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)
{
Expand Down
1 change: 1 addition & 0 deletions src/posix.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 git__page_size(size_t *page_size);
extern int git__mmap_alignment(size_t *page_size);

/**
* Platform-dependent methods
Expand Down
5 changes: 5 additions & 0 deletions src/unix/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ int git__page_size(size_t *page_size)
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 mprot = PROT_READ;
Expand Down
29 changes: 24 additions & 5 deletions src/win32/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,41 @@ static DWORD get_page_size(void)

if (!page_size) {
GetSystemInfo(&sys);
page_size = sys.dwAllocationGranularity;
page_size = sys.dwPageSize;
}

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)
{
*page_size = get_page_size();
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)
{
HANDLE fh = (HANDLE)_get_osfhandle(fd);
DWORD page_size = get_page_size();
DWORD alignment = get_allocation_granularity();
DWORD fmap_prot = 0;
DWORD view_prot = 0;
DWORD off_low = 0;
Expand Down Expand Up @@ -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)
view_prot |= FILE_MAP_READ;

page_start = (offset / page_size) * page_size;
page_start = (offset / alignment) * alignment;
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;
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;
}

Expand Down