2017-11-16 19:17:09 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <cstddef>
|
2018-03-23 16:05:14 +00:00
|
|
|
#include <sys/types.h>
|
2019-01-04 12:10:00 +00:00
|
|
|
#if !defined(_MSC_VER)
|
2017-11-16 19:17:09 +00:00
|
|
|
#include <sys/mman.h>
|
2018-03-23 16:05:14 +00:00
|
|
|
#endif
|
2017-11-16 19:17:09 +00:00
|
|
|
|
2019-03-30 10:47:25 +00:00
|
|
|
|
|
|
|
#ifdef MREMAP_MAYMOVE
|
|
|
|
#define HAS_MREMAP 1
|
2017-11-16 19:17:09 +00:00
|
|
|
#else
|
2019-03-30 10:47:25 +00:00
|
|
|
#define HAS_MREMAP 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
/// You can forcely disable mremap by defining DISABLE_MREMAP to 1 before including this file.
|
|
|
|
#ifndef DISABLE_MREMAP
|
|
|
|
#if HAS_MREMAP
|
|
|
|
#define DISABLE_MREMAP 0
|
|
|
|
#else
|
|
|
|
#define DISABLE_MREMAP 1
|
|
|
|
#endif
|
|
|
|
#endif
|
2017-11-16 19:17:09 +00:00
|
|
|
|
|
|
|
|
2019-03-30 10:47:25 +00:00
|
|
|
/// Implement mremap with mmap/memcpy/munmap.
|
|
|
|
void * mremap_fallback(
|
2019-03-10 03:16:51 +00:00
|
|
|
void * old_address,
|
2017-11-16 19:17:09 +00:00
|
|
|
size_t old_size,
|
|
|
|
size_t new_size,
|
2019-03-30 10:47:25 +00:00
|
|
|
int flags,
|
|
|
|
int mmap_prot,
|
|
|
|
int mmap_flags,
|
|
|
|
int mmap_fd,
|
|
|
|
off_t mmap_offset);
|
2017-11-16 19:17:09 +00:00
|
|
|
|
2019-03-30 10:47:25 +00:00
|
|
|
|
|
|
|
#if !HAS_MREMAP
|
|
|
|
#define MREMAP_MAYMOVE 1
|
|
|
|
|
|
|
|
inline void * mremap(
|
|
|
|
void * old_address,
|
|
|
|
size_t old_size,
|
|
|
|
size_t new_size,
|
|
|
|
int flags = 0,
|
|
|
|
int mmap_prot = 0,
|
|
|
|
int mmap_flags = 0,
|
|
|
|
int mmap_fd = -1,
|
|
|
|
off_t mmap_offset = 0)
|
|
|
|
{
|
|
|
|
return mremap_fallback(old_address, old_size, new_size, flags, mmap_prot, mmap_flags, mmap_fd, mmap_offset);
|
|
|
|
}
|
2017-11-16 19:17:09 +00:00
|
|
|
#endif
|
|
|
|
|
2019-03-30 10:47:25 +00:00
|
|
|
|
2019-03-10 03:16:51 +00:00
|
|
|
inline void * clickhouse_mremap(
|
|
|
|
void * old_address,
|
2017-11-16 19:17:09 +00:00
|
|
|
size_t old_size,
|
|
|
|
size_t new_size,
|
|
|
|
int flags = 0,
|
2017-12-01 18:36:55 +00:00
|
|
|
[[maybe_unused]] int mmap_prot = 0,
|
|
|
|
[[maybe_unused]] int mmap_flags = 0,
|
|
|
|
[[maybe_unused]] int mmap_fd = -1,
|
|
|
|
[[maybe_unused]] off_t mmap_offset = 0)
|
2017-11-16 19:17:09 +00:00
|
|
|
{
|
2019-03-30 10:47:25 +00:00
|
|
|
#if DISABLE_MREMAP
|
|
|
|
return mremap_fallback(old_address, old_size, new_size, flags, mmap_prot, mmap_flags, mmap_fd, mmap_offset);
|
|
|
|
#else
|
|
|
|
|
2019-03-10 03:16:51 +00:00
|
|
|
return mremap(
|
|
|
|
old_address,
|
2017-11-16 19:17:09 +00:00
|
|
|
old_size,
|
|
|
|
new_size,
|
|
|
|
flags
|
|
|
|
#if !defined(MREMAP_FIXED)
|
|
|
|
,
|
|
|
|
mmap_prot,
|
|
|
|
mmap_flags,
|
|
|
|
mmap_fd,
|
|
|
|
mmap_offset
|
|
|
|
#endif
|
|
|
|
);
|
2019-03-30 10:47:25 +00:00
|
|
|
#endif
|
2017-11-16 19:17:09 +00:00
|
|
|
}
|