20 #include <sys/types.h>
32 # include <sys/mman.h>
47 file_(INVALID_HANDLE_VALUE),
48 map_(INVALID_HANDLE_VALUE),
53 ::UnmapViewOfFile(addr_);
56 if (map_ != INVALID_HANDLE_VALUE) {
60 if (file_ != INVALID_HANDLE_VALUE) {
75 if (addr_ != MAP_FAILED) {
76 ::munmap(addr_, length_);
89 size > static_cast<UInt64>(std::numeric_limits< ::size_t>::max()));
92 new_impl.create_(path, size);
101 new_impl.open_(path);
120 void FileImpl::create_(
const char *path,
UInt64 size) {
121 if ((path != NULL) && (path[0] !=
'\0')) {
122 file_ = ::CreateFileA(path, GENERIC_READ | GENERIC_WRITE,
123 FILE_SHARE_READ | FILE_SHARE_WRITE,
124 NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
127 const LONG size_low =
static_cast<LONG
>(size & 0xFFFFFFFFU);
128 LONG size_high =
static_cast<LONG
>(size >> 32);
129 const DWORD file_pos = ::SetFilePointer(file_, size_low, &size_high,
132 (::GetLastError() != 0));
135 map_ = ::CreateFileMapping(file_, NULL, PAGE_READWRITE, 0, 0, NULL);
138 const DWORD size_low =
static_cast<DWORD
>(size & 0xFFFFFFFFU);
139 const DWORD size_high =
static_cast<DWORD
>(size >> 32);
141 map_ = ::CreateFileMapping(file_, NULL, PAGE_READWRITE,
142 size_high, size_low, NULL);
146 addr_ = ::MapViewOfFile(map_, FILE_MAP_WRITE, 0, 0, 0);
150 size_ =
static_cast< ::
size_t>(
size);
153 void FileImpl::open_(
const char *path) {
163 static_cast<UInt64>(st.st_size) > std::numeric_limits< ::size_t>::max());
165 file_ = ::CreateFileA(path, GENERIC_READ | GENERIC_WRITE,
166 FILE_SHARE_READ | FILE_SHARE_WRITE,
167 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
170 map_ = ::CreateFileMapping(file_, NULL, PAGE_READWRITE, 0, 0, NULL);
173 addr_ = ::MapViewOfFile(map_, FILE_MAP_WRITE, 0, 0, 0);
177 size_ =
static_cast< ::
size_t>(st.st_size);
190 void FileImpl::create_(
const char *path,
UInt64 size) {
192 size > static_cast<UInt64>(std::numeric_limits< ::off_t>::max()));
194 if ((path != NULL) && (path[0] !=
'\0')) {
195 fd_ =
::open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
198 const ::off_t file_size =
static_cast< ::off_t
>(
size);
203 const int flags = (fd_ == -1) ? (MAP_PRIVATE | MAP_ANONYMOUS) : MAP_SHARED;
204 #else // MAP_ANONYMOUS
205 const int flags = (fd_ == -1) ? (MAP_PRIVATE | MAP_ANON) : MAP_SHARED;
206 #endif // MAP_ANONYMOUS
208 length_ =
static_cast< ::
size_t>(
size);
209 #ifdef USE_MAP_HUGETLB
210 addr_ = ::mmap(NULL, length_, PROT_READ | PROT_WRITE,
211 flags | MAP_HUGETLB, fd_, 0);
212 #endif // USE_MAP_HUGETLB
213 if (addr_ == MAP_FAILED) {
214 addr_ = ::mmap(NULL, length_, PROT_READ | PROT_WRITE, flags, fd_, 0);
222 void FileImpl::open_(
const char *path) {
228 static_cast<UInt64>(st.st_size) > std::numeric_limits< ::size_t>::max());
230 fd_ =
::open(path, O_RDWR);
233 length_ =
static_cast<std::size_t
>(st.st_size);
234 addr_ = ::mmap(NULL, length_, PROT_READ | PROT_WRITE, MAP_SHARED, fd_, 0);