]>
git.proxmox.com Git - libgit2.git/blob - src/util/win32/map.c
2 * Copyright (C) the libgit2 contributors. All rights reserved.
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
15 static DWORD
get_page_size(void)
17 static DWORD page_size
;
22 page_size
= sys
.dwPageSize
;
28 static DWORD
get_allocation_granularity(void)
30 static DWORD granularity
;
35 granularity
= sys
.dwAllocationGranularity
;
41 int git__page_size(size_t *page_size
)
43 *page_size
= get_page_size();
47 int git__mmap_alignment(size_t *page_size
)
49 *page_size
= get_allocation_granularity();
53 int p_mmap(git_map
*out
, size_t len
, int prot
, int flags
, int fd
, off64_t offset
)
55 HANDLE fh
= (HANDLE
)_get_osfhandle(fd
);
56 DWORD alignment
= get_allocation_granularity();
64 GIT_MMAP_VALIDATE(out
, len
, prot
, flags
);
70 if (fh
== INVALID_HANDLE_VALUE
) {
72 git_error_set(GIT_ERROR_OS
, "failed to mmap. Invalid handle value");
76 if (prot
& GIT_PROT_WRITE
)
77 fmap_prot
|= PAGE_READWRITE
;
78 else if (prot
& GIT_PROT_READ
)
79 fmap_prot
|= PAGE_READONLY
;
81 if (prot
& GIT_PROT_WRITE
)
82 view_prot
|= FILE_MAP_WRITE
;
83 if (prot
& GIT_PROT_READ
)
84 view_prot
|= FILE_MAP_READ
;
86 page_start
= (offset
/ alignment
) * alignment
;
87 page_offset
= offset
- page_start
;
89 if (page_offset
!= 0) { /* offset must be multiple of the allocation granularity */
91 git_error_set(GIT_ERROR_OS
, "failed to mmap. Offset must be multiple of allocation granularity");
95 out
->fmh
= CreateFileMapping(fh
, NULL
, fmap_prot
, 0, 0, NULL
);
96 if (!out
->fmh
|| out
->fmh
== INVALID_HANDLE_VALUE
) {
97 git_error_set(GIT_ERROR_OS
, "failed to mmap. Invalid handle value");
102 off_low
= (DWORD
)(page_start
);
103 off_hi
= (DWORD
)(page_start
>> 32);
104 out
->data
= MapViewOfFile(out
->fmh
, view_prot
, off_hi
, off_low
, len
);
106 git_error_set(GIT_ERROR_OS
, "failed to mmap. No data written");
107 CloseHandle(out
->fmh
);
116 int p_munmap(git_map
*map
)
123 if (!UnmapViewOfFile(map
->data
)) {
124 git_error_set(GIT_ERROR_OS
, "failed to munmap. Could not unmap view of file");
131 if (!CloseHandle(map
->fmh
)) {
132 git_error_set(GIT_ERROR_OS
, "failed to munmap. Could not close handle");