mirror of
https://github.com/matrix-construct/construct
synced 2024-09-27 19:28:52 +02:00
ircd::fs: Support more exotic alignments for memory mapped files.
This commit is contained in:
parent
b3dc9a9ac3
commit
6843d7a98d
3 changed files with 38 additions and 7 deletions
|
@ -1189,6 +1189,7 @@ AC_CHECK_FUNCS([ \
|
|||
mlock2 \
|
||||
mmap \
|
||||
mprotect \
|
||||
mremap \
|
||||
msync \
|
||||
posix_fadvise \
|
||||
posix_madvise \
|
||||
|
|
|
@ -46,6 +46,7 @@ struct ircd::fs::map
|
|||
struct ircd::fs::map::opts
|
||||
:fd::opts
|
||||
{
|
||||
uint alignment {0};
|
||||
bool execute {false};
|
||||
bool shared {false};
|
||||
bool reserve {false};
|
||||
|
|
43
ircd/fs.cc
43
ircd/fs.cc
|
@ -2047,25 +2047,51 @@ ircd::fs::map::default_opts;
|
|||
ircd::fs::map::map(const fd &fd,
|
||||
const opts &opts,
|
||||
const size_t &size)
|
||||
#if defined(HAVE_MMAP)
|
||||
{
|
||||
const auto map_size
|
||||
{
|
||||
size?: fs::size(fd)
|
||||
};
|
||||
|
||||
#ifdef HAVE_MMAP
|
||||
void *const &ptr
|
||||
void *ptr
|
||||
{
|
||||
::mmap(nullptr, map_size, prot(opts), flags(opts), int(fd), opts.offset)
|
||||
::mmap
|
||||
(
|
||||
nullptr,
|
||||
map_size,
|
||||
prot(opts),
|
||||
flags(opts),
|
||||
int(fd),
|
||||
opts.offset
|
||||
)
|
||||
};
|
||||
#else
|
||||
#error "Missing ::mmap(2) on this platform."
|
||||
#endif
|
||||
|
||||
if(unlikely(ptr == MAP_FAILED))
|
||||
throw_system_error(errno);
|
||||
|
||||
static_cast<mutable_buffer &>(*this) = mutable_buffer
|
||||
#if defined(HAVE_MREMAP)
|
||||
if(opts.alignment && !aligned(ptr, opts.alignment))
|
||||
{
|
||||
assert(opts.alignment > 1);
|
||||
assert(opts.alignment > info::page_size);
|
||||
ptr = ::mremap
|
||||
(
|
||||
ptr,
|
||||
map_size,
|
||||
map_size,
|
||||
MREMAP_FIXED | MREMAP_MAYMOVE,
|
||||
align_up(ptr, opts.alignment) + pad_to(map_size, opts.alignment)
|
||||
);
|
||||
|
||||
if(unlikely(ptr == MAP_FAILED))
|
||||
throw_system_error(errno);
|
||||
}
|
||||
#endif
|
||||
|
||||
assert(aligned(ptr, opts.alignment));
|
||||
assert(padded(map_size, opts.alignment));
|
||||
static_cast<mutable_buffer &>(*this) =
|
||||
{
|
||||
reinterpret_cast<char *>(ptr),
|
||||
map_size
|
||||
|
@ -2084,6 +2110,9 @@ ircd::fs::map::map(const fd &fd,
|
|||
if(advise)
|
||||
fs::advise(*this, advise, map_size);
|
||||
}
|
||||
#else
|
||||
#error "Missing mmap(2) on this platform."
|
||||
#endif
|
||||
|
||||
ircd::fs::map::~map()
|
||||
noexcept try
|
||||
|
|
Loading…
Reference in a new issue