Dominic Lachowicz <cinamod@hotmail.com>
authorPatrick Lam <plam@MIT.EDU>
Wed, 19 Apr 2006 16:53:50 +0000 (16:53 +0000)
committerPatrick Lam <plam@MIT.EDU>
Wed, 19 Apr 2006 16:53:50 +0000 (16:53 +0000)
Implement mmap-like code for Windows using MapViewOfFile.

ChangeLog
src/fccache.c

index 15b3662..0f83c24 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,13 @@
        Bump version to 2.3.95.
 
 2006-04-19  Patrick Lam         <plam@mit.edu>
+           Dominic Lachowicz  <cinamod@hotmail.com>
+
+       * src/fccache.c (FcDirCacheConsume):
+
+       Implement mmap-like code for Windows using MapViewOfFile.
+       
+2006-04-19  Patrick Lam         <plam@mit.edu>
        * src/fccache.c (FcDirCacheConsume, FcCacheNextOffset):
 
        Bail gracefully if the cache file does not contain enough data.
index c98c001..8f25b2c 100644 (file)
 #include <dirent.h>
 #include <string.h>
 #include <sys/types.h>
-#include <unistd.h>
 #include "fcint.h"
-#include <unistd.h>
 #if defined(HAVE_MMAP) || defined(__CYGWIN__)
+#  include <unistd.h>
 #  include <sys/mman.h>
-#  include <sys/utsname.h>
+#elif defined(_WIN32)
+#  include <windows.h>
 #endif
 
 #define ENDIAN_TEST 0x12345678
@@ -1203,6 +1203,23 @@ FcDirCacheConsume (int fd, const char * dir, FcFontSet *set, FcConfig *config)
                              PROT_READ, MAP_SHARED, fd, pos);
     if (current_dir_block == MAP_FAILED)
        return FcFalse;
+#elif defined(_WIN32)
+       {
+               HANDLE hFileMap;
+
+               hFileMap = CreateFileMapping((HANDLE) _get_osfhandle(fd), NULL, PAGE_READONLY, 0, 0, NULL);
+               if (hFileMap == NULL)
+                       return FcFalse;
+
+               current_dir_block = MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, metadata.count + pos);
+               if (current_dir_block == NULL)
+               {
+                       CloseHandle (hFileMap);
+                       return FcFalse;
+               }
+
+               current_dir_block = (void *)((char *)current_dir_block + pos);
+       }
 #else
     current_dir_block = malloc (metadata.count);
     if (!current_dir_block)