From 6d4e06b403051617aa749ce2af60190e9ecea7ee Mon Sep 17 00:00:00 2001 From: ksherlock Date: Sun, 14 Mar 2010 12:35:22 +0000 Subject: [PATCH] git-svn-id: https://profuse.googlecode.com/svn/branches/v2@200 aa027e90-d47c-11dd-86d7-074df07e0730 --- MappedFile.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 MappedFile.cpp 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