24 #if !defined(_WIN64) && !defined(BARE_METAL)
33 #include <sys/types.h>
51 std::pair<size_t, bool> get_file_size(
const std::string &filename)
54 memset(&st, 0,
sizeof(
struct stat));
55 if (stat(filename.c_str(), &st) == 0)
57 return std::make_pair(st.st_size,
true);
61 return std::make_pair(0,
false);
69 size_t get_page_size()
71 return sysconf(_SC_PAGESIZE);
80 : _filename(std::move(filename)), _file_size(0), _map_size(size), _map_offset(
offset), _fp(nullptr), _data(nullptr)
82 map(_filename, _map_size, _map_offset);
99 _fp = fopen(filename.c_str(),
"a+be");
106 int fd = fileno(_fp);
107 bool status = fd >= 0;
111 std::tie(_file_size, status) = get_file_size(_filename);
116 _map_size = (size == 0) ? _file_size : size;
120 if ((_map_offset > _file_size) || (_map_offset % get_page_size() != 0))
127 if (_map_offset + _map_size > _file_size)
129 _map_size = _file_size - _map_offset;
133 _data = ::mmap(
nullptr, _map_size, PROT_WRITE, MAP_SHARED, fd, _map_offset);
149 if (_data !=
nullptr)
151 ::munmap(_data, _file_size);
170 return static_cast<unsigned char *
>(_data);
185 return _data !=
nullptr;
190 #endif // !defined(BARE_METAL)