diff --git a/MappedFile.cpp b/MappedFile.cpp new file mode 100644 index 0000000..32d3e3a --- /dev/null +++ b/MappedFile.cpp @@ -0,0 +1,61 @@ +#include +#include + +#include + +class MappedFile +{ +public: + + MappedFile(int fd, bool readOnly) + { + _fd = fd; + _length = ::lseek(fd, 0, SEEK_END); + _address = MAP_FAILED; + if (_length > 0) + { + _address = ::mmap(0, _length, + readOnly ? PROT_READ : PROT_READ | PROT_WRITE, + MAP_FILE, fd, 0); + } + } + + MappedFile(void *address, size_t size) + { + _fd = -1; + _address = address; + _size = size; + } + + ~MappedFile() + { + if (_address != MAP_FAILED) ::munmap(_address, _length); + if (_fd != -1) ::close(_fd); + } + + void *address() const + { + return _address; + } + + size_t length() + { + return _length; + } + + int sync() + { + + if (::msync(_address, _length, MS_SYNC) == 0) + return 0; + return errno; + } + + + +private: + int _fd; + void *_address; + size_t _length; + +}; \ No newline at end of file