1212#include < cassert>
1313#include < cstring>
1414
15- // headers for POSIX mmap
15+ // mmap
1616#if defined (__unix__) || defined (__APPLE__)
1717# include < sys/mman.h>
1818# include < fcntl.h>
1919# include < unistd.h>
20+ #elif defined(_WIN32)
21+ # define WIN32_LEAN_AND_MEAN
22+ # include < Windows.h>
23+ // #include <Memoryapi.h>
2024#endif
2125
2226#define LLAMA_USE_SCRATCH
@@ -312,8 +316,31 @@ static void mmap_file(const char* fname, void * &mm_addr, size_t &mm_length) {
312316 mm_addr = NULL ;
313317 mm_length = 0 ;
314318 }
319+ #elif defined(_WIN32)
320+ mm_addr = NULL ;
321+
322+ HANDLE hFile = CreateFileA (filename, GENERIC_READ, FILE_SHARE_READ, NULL , OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
323+ if (hFile == INVALID_HANDLE_VALUE) {
324+ return ;
325+ }
326+
327+ // not really necessary
328+ LARGE_INTEGER fileSize;
329+ GetFileSizeEx (hFile, &fileSize);
330+ mm_length = fileSize;
331+
332+ HANDLE hMapping = CreateFileMappingA (hFile, NULL , PAGE_READONLY, 0 , 0 , NULL );
333+ CloseHandle (hFile);
334+
335+ if (hMapping == NULL ) {
336+ return ;
337+ }
338+
339+ mm_addr = MapViewOfFile (hMapping, FILE_MAP_READ, 0 , 0 , 0 );
340+ CloseHandle (hMapping);
315341#else
316- // TODO: windows support
342+ mm_addr = NULL ;
343+ mm_length = 0 ;
317344 (void )(fname); // suppress warnings
318345#endif
319346}
@@ -322,8 +349,9 @@ static void munmap_file(void * addr, size_t length) {
322349#if defined(MAP_FAILED)
323350 // POSIX
324351 munmap (addr, length);
352+ #elif defined(_WIN32)
353+ UnmapViewOfFile (addr);
325354#else
326- // TODO: windows support
327355 (void )(addr); // suppress warnings
328356 (void )(length);
329357#endif
0 commit comments