#include #include bool MemoryMappedFile::open(const String& pathFileName,CreationFlags creationFlags) { if(isOkay()) { close(); } mFD=::open(pathFileName,getFileAccessFromFlags(creationFlags)); mCreationFlags= creationFlags; if(!isOkay())return false; struct stat sb; if(-1==::fstat(mFD,&sb)) { close(); return false; } mFileLength = sb.st_size; if(!createMemoryMap()) { close(); return false; } return true; } bool MemoryMappedFile::createMemoryMap(void) { void *pAddress = ::mmap(NULL,mFileLength,getMemoryMapAccessFromFlags(mCreationFlags),mCreationFlags == CreationFlags::ReadOnly?MAP_PRIVATE:MAP_SHARED,mFD,0); if(MAP_FAILED == pAddress) { return false; } mlpMappedDataBase = (char *)pAddress; mIndex=0; return true; } void MemoryMappedFile::close() { if(!isOkay())return; ::munmap((void*)mlpMappedDataBase, mFileLength); ::close(mFD); mFD=-1; mFileLength=-1; } int MemoryMappedFile::getFileAccessFromFlags(CreationFlags creationFlags)const { switch(creationFlags) { case ReadOnly : return O_RDONLY | S_IRUSR ; case ReadWrite : return O_RDWR | O_CREAT, S_IRUSR | S_IWUSR; default : throw new Exception("Undefined creation flag"); } } int MemoryMappedFile::getMemoryMapAccessFromFlags(CreationFlags creationFlags)const { switch(creationFlags) { case ReadOnly : return PROT_READ; case ReadWrite : return PROT_READ | PROT_WRITE; default : throw new Exception("Undefined creation flag"); } }