From 9ffd19af2e2a17ccd0c7ad7b4cf6d8c3e9a56bae Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 1 Apr 2008 06:16:24 +0000 Subject: Implement Path::MapInFilePages/UnMapFilePages on unix, which 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 | 3 +-- lib/System/Unix/Path.inc | 15 ++++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/System/Unix/MappedFile.inc b/lib/System/Unix/MappedFile.inc index 35efaa6..c85a53d 100644 --- a/lib/System/Unix/MappedFile.inc +++ b/lib/System/Unix/MappedFile.inc @@ -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; diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc index b0578dc..0707de6 100644 --- a/lib/System/Unix/Path.inc +++ b/lib/System/Unix/Path.inc @@ -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 -- cgit v1.1