Implement Path::MapInFilePages/UnMapFilePages on unix, which
authorChris Lattner <sabre@nondot.org>
Tue, 1 Apr 2008 06:16:24 +0000 (06:16 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 1 Apr 2008 06:16:24 +0000 (06:16 +0000)
provides fast MappedFile::getFile for large files.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49034 91177308-0d34-0410-b5e6-96231b3b80d8

lib/System/Unix/MappedFile.inc
lib/System/Unix/Path.inc

index 35efaa6fcb973fc1162be897dc8869330f718f5e..c85a53d6641410ac732248af9f29de2084ba41df 100644 (file)
@@ -75,7 +75,6 @@ const void* MappedFile::map(std::string* ErrMsg) {
   assert(MapInfo && "MappedFile not initialized");
   if (isMapped()) return BasePtr;
   
-  int prot = PROT_READ;
   int flags = MAP_PRIVATE;
 #ifdef MAP_FILE
   flags |= MAP_FILE;
@@ -83,7 +82,7 @@ const void* MappedFile::map(std::string* ErrMsg) {
   size_t PageSize = Process::GetPageSize();
   size_t map_size = ((MapInfo->Size / PageSize)+1) * PageSize;
 
-  BasePtr = ::mmap(0, map_size, prot, flags, MapInfo->FD, 0);
+  BasePtr = ::mmap(0, map_size, PROT_READ, flags, MapInfo->FD, 0);
   if (BasePtr == MAP_FAILED) {
     MakeErrMsg(ErrMsg, "Can't map file:" + Path.toString());
     return 0;
index b0578dcdba40f774758cc9fefd7c2be8143acc64..0707de645835455c0aca000a089a44853c40bbc3 100644 (file)
@@ -745,14 +745,19 @@ Path::makeUnique(bool reuse_current, std::string* ErrMsg) {
   return false;
 }
 
-/// MapInFilePages - Not yet implemented on win32.
 const char *Path::MapInFilePages(int FD, uint64_t FileSize) {
-  return 0;
+  int Flags = MAP_PRIVATE;
+#ifdef MAP_FILE
+  Flags |= MAP_FILE;
+#endif
+  void *BasePtr = ::mmap(0, FileSize, PROT_READ, Flags, FD, 0);
+  if (BasePtr == MAP_FAILED)
+    return 0;
+  return BasePtr;
 }
 
-/// MapInFilePages - Not yet implemented on win32.
-void Path::UnMapFilePages(const char *Base, uint64_t FileSize) {
-  assert(0 && "NOT IMPLEMENTED");
+void Path::UnMapFilePages(const char *BasePtr, uint64_t FileSize) {
+  ::munmap(BasePtr, FileSize);
 }
 
 } // end llvm namespace