18 #ifndef PSTORE_CORE_REGION_HPP 19 #define PSTORE_CORE_REGION_HPP 26 constexpr std::uint64_t round_up (std::uint64_t
const x, std::uint64_t
const y) noexcept {
27 return (x + y - 1) / y * y;
30 using memory_mapper_ptr = std::shared_ptr<memory_mapper_base>;
48 template <
typename File,
typename MemoryMapper>
51 using container_type = std::vector<pstore::region::memory_mapper_ptr>;
57 region_builder (std::shared_ptr<File> file, std::uint64_t full_size,
58 std::uint64_t minimum_size) noexcept;
71 auto operator() (std::uint64_t bytes_to_map) -> container_type;
85 std::uint64_t bytes_to_map);
89 std::uint64_t offset, std::uint64_t size);
93 void check_regions_are_contiguous (container_type
const & regions);
97 std::shared_ptr<File> file_;
100 std::uint64_t
const full_size_;
102 std::uint64_t
const minimum_size_;
107 template <
typename File,
typename MemoryMapper>
109 std::shared_ptr<File> file, std::uint64_t
const full_size,
110 std::uint64_t
const minimum_size) noexcept
112 , full_size_ (full_size)
113 , minimum_size_ (minimum_size) {
115 PSTORE_ASSERT (full_size >= minimum_size && full_size_ % minimum_size_ == 0);
120 template <
typename File,
typename MemoryMapper>
122 std::uint64_t offset,
123 std::uint64_t bytes_to_map) {
124 PSTORE_ASSERT (regions !=
nullptr);
125 PSTORE_ASSERT (offset % minimum_size_ == 0);
126 bytes_to_map = round_up (bytes_to_map, minimum_size_);
127 PSTORE_ASSERT (bytes_to_map % minimum_size_ == 0);
131 while (bytes_to_map > 0) {
133 std::uint64_t
const size = std::min (full_size_, bytes_to_map);
135 bytes_to_map -= size;
136 this->push (regions, bytes_to_map,
139 offset += full_size_;
141 this->check_regions_are_contiguous (*regions);
146 template <
typename File,
typename MemoryMapper>
149 container_type regions;
150 this->
append (®ions, 0 , bytes_to_map);
156 template <
typename File,
typename MemoryMapper>
159 std::uint64_t
const ,
160 std::uint64_t offset, std::uint64_t size) {
161 PSTORE_ASSERT (regions !=
nullptr);
162 PSTORE_ASSERT (size >= minimum_size_);
166 std::make_shared<MemoryMapper> (*file_, file_->is_writable (), offset, size));
171 template <
typename File,
typename MemoryMapper>
173 container_type
const & regions) {
179 for (pstore::region::memory_mapper_ptr
const & region : regions) {
180 PSTORE_ASSERT (region->offset () == p);
181 p += region->size ();
189 constexpr
bool small_files_enabled () noexcept {
190 #ifdef PSTORE_POSIX_SMALL_FILES 218 virtual std::vector<memory_mapper_ptr> init () = 0;
220 virtual void add (
gsl::not_null<std::vector<memory_mapper_ptr> *> regions,
221 std::uint64_t original_size, std::uint64_t new_size) = 0;
223 virtual std::shared_ptr<file::file_base> file () = 0;
225 std::uint64_t full_size ()
const noexcept {
return full_size_; }
226 std::uint64_t min_size ()
const noexcept {
return min_size_; }
232 constexpr
factory (std::uint64_t
const full_size, std::uint64_t
const min_size) noexcept
233 : full_size_{full_size}
234 , min_size_{min_size} {
235 PSTORE_ASSERT (full_size_ % min_size_ == 0);
238 template <
typename File,
typename MemoryMapper>
239 auto create (std::shared_ptr<File> file) -> std::vector<memory_mapper_ptr>;
241 template <
typename File,
typename MemoryMapper>
242 void append (std::shared_ptr<File> file,
244 std::uint64_t original_size, std::uint64_t new_size);
247 std::uint64_t
const full_size_;
248 std::uint64_t
const min_size_;
253 template <
typename File,
typename MemoryMapper>
254 auto factory::create (std::shared_ptr<File> file) -> std::vector<memory_mapper_ptr> {
260 std::uint64_t
const file_size = file->size ();
263 return builder (file_size);
268 template <
typename File,
typename MemoryMapper>
269 void factory::append (std::shared_ptr<File> file,
271 std::uint64_t original_size, std::uint64_t new_size) {
273 PSTORE_ASSERT (new_size >= original_size);
275 auto const min_size = this->min_size ();
278 new_size = round_up (new_size, min_size);
279 if (!small_files_enabled ()) {
280 file->truncate (new_size);
282 builder.
append (regions, original_size, new_size - original_size);
297 std::uint64_t full_size, std::uint64_t min_size);
299 std::vector<memory_mapper_ptr> init ()
override;
300 void add (
gsl::not_null<std::vector<memory_mapper_ptr> *> regions,
301 std::uint64_t original_size, std::uint64_t new_size)
override;
303 std::shared_ptr<file::file_base> file ()
override;
306 std::shared_ptr<file::file_handle> file_;
321 std::uint64_t full_size, std::uint64_t min_size);
323 std::vector<memory_mapper_ptr> init ()
override;
324 void add (
gsl::not_null<std::vector<memory_mapper_ptr> *> regions,
325 std::uint64_t original_size, std::uint64_t new_size)
override;
327 std::shared_ptr<file::file_base> file ()
override;
330 std::shared_ptr<file::in_memory> file_;
334 std::unique_ptr<factory> get_factory (std::shared_ptr<file::file_handle>
const & file,
335 std::uint64_t full_size, std::uint64_t min_size);
337 std::unique_ptr<factory> get_factory (std::shared_ptr<file::in_memory>
const & file,
338 std::uint64_t full_size, std::uint64_t min_size);
341 #endif // PSTORE_CORE_REGION_HPP Provides a portable interface for memory mapping portions of a file or for treating regions of memory...
void append(gsl::not_null< container_type *> regions, std::uint64_t offset, std::uint64_t bytes_to_map)
Creates one of more additional memory-mapped regions covering the file starting at the position given...
Definition: region.hpp:121
auto operator()(std::uint64_t bytes_to_map) -> container_type
Definition: region.hpp:147
Definition: region.hpp:205
Definition: region.hpp:315
region_builder(std::shared_ptr< File > file, std::uint64_t full_size, std::uint64_t minimum_size) noexcept
Definition: region.hpp:108
A class which is responsible for creating the memory-mapped regions used by the data store...
Definition: region.hpp:49
Definition: nonpod2.cpp:40
Definition: region.hpp:291
constexpr factory(std::uint64_t const full_size, std::uint64_t const min_size) noexcept
Definition: region.hpp:232