31#ifndef detail_ut_aligned_alloc_h 
   32#define detail_ut_aligned_alloc_h 
  113  template <
bool Zero_initialized>
 
  114  static inline std::pair<data_segment_ptr, std::size_t> 
alloc(
 
  115      std::size_t size, std::size_t alignment) 
noexcept {
 
  118    assert(alignment > 
alignof(std::max_align_t));
 
  206    const std::size_t data_len = size + alignment;
 
  207    void *
mem = Alloc_fn::alloc<Zero_initialized>(data_len);
 
  217        reinterpret_cast<void *
>(
reinterpret_cast<std::uintptr_t
>(
mem) + 1);
 
  218    std::size_t 
buf_size = data_len - 1;
 
  224    [[maybe_unused]] 
auto ret = std::align(alignment, size, 
buf, 
buf_size);
 
  225    assert(ret != 
nullptr);
 
  227    return {
buf, 
reinterpret_cast<std::uintptr_t
>(
buf) -
 
  228                     reinterpret_cast<std::uintptr_t
>(
mem)};
 
  274template <
typename Meta_1_type, 
typename Meta_2_type>
 
  290                "Aligned_alloc_impl provides a strong guarantee " 
  291                "of only up to Aligned_alloc_impl::metadata_size bytes.");
 
  296                            std::size_t meta_1_v) 
noexcept {
 
  297    assert(meta_1_v <= std::numeric_limits<meta_1_t>::max());
 
  303                            std::size_t meta_2_v) 
noexcept {
 
  304    assert(meta_2_v <= std::numeric_limits<meta_2_t>::max());
 
  329    return reinterpret_cast<meta_1_t *
>(data) - 1;
 
  405  template <
bool Zero_initialized>
 
  406  static inline void *
alloc(std::size_t size, std::size_t alignment) {
 
  407    auto ret = Aligned_alloc_impl::alloc<Zero_initialized>(size, alignment);
 
  467    return reinterpret_cast<void *
>(
reinterpret_cast<std::uintptr_t
>(data) -
 
  574  template <
bool Zero_initialized>
 
  575  static inline void *
alloc(std::size_t size, std::size_t alignment,
 
  584    const auto total_len = size + metadata_len;
 
  586        Aligned_alloc_impl::alloc<Zero_initialized>(total_len, alignment);
 
  587    if (
unlikely(!ret.first)) 
return nullptr;
 
  596#ifdef HAVE_PSI_MEMORY_INTERFACE 
  602    const auto datalen = total_len + ret.second;
 
  617    return static_cast<uint8_t *
>(ret.first) + metadata_len;
 
  629#ifdef HAVE_PSI_MEMORY_INTERFACE 
  669    return reinterpret_cast<void *
>(
reinterpret_cast<std::uintptr_t
>(pfs_meta) -
 
  677template <
bool Pfs_memory_instrumentation_on>
 
  689template <
bool Pfs_memory_instrumentation_on>
 
  696template <
typename Impl>
 
  698  template <
bool Zero_initialized, 
typename T = Impl>
 
  701    return Impl::template alloc<Zero_initialized>(size, alignment, 
key);
 
  703  template <
bool Zero_initialized, 
typename T = Impl>
 
  706    return Impl::template alloc<Zero_initialized>(size, alignment);
 
  709  static inline size_t datalen(
void *ptr) { 
return Impl::datalen(ptr); }
 
#define PSI_MEMORY_CALL(M)
Definition: psi_memory.h:36
 
constexpr DWORD buf_size
Definition: create_def.cc:228
 
unsigned int PSI_memory_key
Instrumented memory key.
Definition: psi_memory_bits.h:49
 
#define free(A)
Definition: lexyy.cc:915
 
Header for compiler-dependent features.
 
constexpr bool likely(bool expr)
Definition: my_compiler.h:55
 
constexpr bool unlikely(bool expr)
Definition: my_compiler.h:56
 
Definition: buf0block_hint.cc:30
 
Definition: fts0fts.cc:236
 
static PSI_memory_key memory_alloc(PSI_memory_key, size_t, struct PSI_thread **owner)
Definition: psi_memory_v2_empty.cc:35
 
static void memory_free(PSI_memory_key, size_t, struct PSI_thread *)
Definition: psi_memory_v2_empty.cc:53
 
constexpr size_t calc_align(size_t n, size_t m)
Calculates the smallest multiple of m that is not smaller than n when m is a power of two.
Definition: helper.h:45
 
typename select_alloc_impl< Pfs_memory_instrumentation_on >::type select_alloc_impl_t
Just a small helper type which saves us some keystrokes.
Definition: aligned_alloc.h:691
 
This file contains a set of libraries providing overloads for regular dynamic allocation routines whi...
Definition: aligned_alloc.h:48
 
required string key
Definition: replication_asynchronous_connection_failover.proto:60
 
required string type
Definition: replication_group_member_actions.proto:34
 
static MEM_ROOT mem
Definition: sql_servers.cc:99
 
Implementation bits and pieces for PFS metadata handling.
 
Small wrapper which utilizes SFINAE to dispatch the call to appropriate aligned allocator implementat...
Definition: aligned_alloc.h:697
 
static void free(void *ptr)
Definition: aligned_alloc.h:708
 
static size_t datalen(void *ptr)
Definition: aligned_alloc.h:709
 
static std::enable_if< T::is_pfs_instrumented_v, void * >::type alloc(size_t size, size_t alignment, PSI_memory_key key)
Definition: aligned_alloc.h:700
 
static std::enable_if<!T::is_pfs_instrumented_v, void * >::type alloc(size_t size, size_t alignment, PSI_memory_key)
Definition: aligned_alloc.h:705
 
Definition: aligned_alloc.h:51
 
static constexpr uint32_t metadata_size
Block of memory returned by this functor will have an additional (metadata) segment (at no additional...
Definition: aligned_alloc.h:58
 
static void free(void *ptr) noexcept
Releases storage allocated through alloc().
Definition: aligned_alloc.h:236
 
static std::pair< data_segment_ptr, std::size_t > alloc(std::size_t size, std::size_t alignment) noexcept
Dynamically allocates storage of given size and at the address aligned to the requested alignment.
Definition: aligned_alloc.h:114
 
void * data_segment_ptr
Alias that we will be using to denote ptr to DATA segment.
Definition: aligned_alloc.h:61
 
Aligned allocation routines which are instrumented through PFS (performance-schema).
Definition: aligned_alloc.h:561
 
static void * alloc(std::size_t size, std::size_t alignment, pfs_metadata::pfs_memory_key_t key)
Dynamically allocates storage of given size at the address aligned to the requested alignment.
Definition: aligned_alloc.h:575
 
static void free(PFS_metadata::data_segment_ptr data) noexcept
Releases storage dynamically allocated through Aligned_alloc_pfs::alloc().
Definition: aligned_alloc.h:626
 
static void * deduce(PFS_metadata::data_segment_ptr data) noexcept
Helper function which deduces the original pointer returned by Aligned_alloc_impl from a pointer whic...
Definition: aligned_alloc.h:662
 
static allocator_metadata::meta_2_t datalen(PFS_metadata::data_segment_ptr data)
Returns the number of bytes requested to be allocated.
Definition: aligned_alloc.h:651
 
Aligned allocation routines.
Definition: aligned_alloc.h:394
 
static void * alloc(std::size_t size, std::size_t alignment)
Dynamically allocates storage of given size and at the address aligned to the requested alignment.
Definition: aligned_alloc.h:406
 
static void * deduce(Aligned_alloc_impl::data_segment_ptr data) noexcept
Helper function which deduces the original pointer returned by Aligned_alloc_impl from a pointer whic...
Definition: aligned_alloc.h:462
 
static allocator_metadata::meta_2_t datalen(Aligned_alloc_impl::data_segment_ptr data)
Returns the number of bytes requested to be allocated.
Definition: aligned_alloc.h:451
 
static void free(Aligned_alloc_impl::data_segment_ptr data) noexcept
Releases storage dynamically allocated through Aligned_alloc::alloc().
Definition: aligned_alloc.h:437
 
static void free(void *ptr)
Definition: allocator_traits.h:105
 
Simple allocator traits.
Definition: allocator_traits.h:82
 
Simple utility metafunction which selects appropriate allocator variant (implementation) depending on...
Definition: aligned_alloc.h:678