| 268 | } |
| 269 | |
| 270 | void * MNNMmapFile(file_t file, size_t size, bool onlyRead) |
| 271 | { |
| 272 | if (file == INVALID_FILE || MNNGetFileSize(file) < size) { |
| 273 | return nullptr; |
| 274 | } |
| 275 | #if defined(WIN32) || defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) |
| 276 | HANDLE hFileMapping = CreateFileMapping(file, NULL, PAGE_READWRITE, (size >> 32) & 0xffffffff, size & 0xffffffff, NULL); |
| 277 | if (hFileMapping == NULL) { |
| 278 | MNN_ERROR("MNN: Mmap failed\n"); |
| 279 | return nullptr; |
| 280 | } |
| 281 | auto mode = FILE_MAP_READ | FILE_MAP_WRITE; |
| 282 | if (onlyRead) { |
| 283 | mode = FILE_MAP_READ; |
| 284 | } |
| 285 | void * addr = MapViewOfFile(hFileMapping, mode, 0, 0, size); |
| 286 | CloseHandle(hFileMapping); |
| 287 | return addr; |
| 288 | #else |
| 289 | auto mode = PROT_READ | PROT_WRITE; |
| 290 | if (onlyRead) { |
| 291 | mode = PROT_READ; |
| 292 | } |
| 293 | void * addr = mmap(NULL, size, mode, MAP_SHARED, file, 0); |
| 294 | if (addr == MAP_FAILED) { |
| 295 | MNN_ERROR("MNN: Mmap failed\n"); |
| 296 | return nullptr; |
| 297 | } |
| 298 | return addr; |
| 299 | #endif |
| 300 | } |
| 301 | |
| 302 | ErrorCode MNNUnmapFile(void * addr, size_t size) |
| 303 | { |