mirror of
https://github.com/ksherlock/profuse.git
synced 2025-01-10 07:30:09 +00:00
61 lines
1009 B
C++
61 lines
1009 B
C++
#include <unistd.h>
|
|
#include <sys/mman.h>
|
|
|
|
#include <cerrno>
|
|
|
|
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;
|
|
|
|
}; |