/********************************************************************** Audacity: A Digital Audio Editor MemoryX.cpp Paul Licameli **********************************************************************/ #include "MemoryX.h" // Make the symbol table non-empty UTILITY_API void lib_utility_dummy_symbol() {} constexpr auto sizeof_align_val = sizeof(std::align_val_t); void *NonInterferingBase::operator new(std::size_t count, std::align_val_t al) { using namespace std; // Get an allocation with sufficient extra space to remember the alignment // (And to do that, adjust the alignment to be not less than the alignment of // an alignment value!). // Also increase the allocation by one entire alignment. al = max( al, static_cast( alignof(align_val_t) ) ); const auto al_as_size = static_cast(al); auto ptr = static_cast( ::operator new( count + sizeof_align_val + al_as_size ) ); // Adjust the pointer to a properly aligned one, with a space just before it // to remember the adjustment ptr += sizeof_align_val; auto integer = reinterpret_cast(ptr); const auto partial = integer % al_as_size; auto adjustment = partial ? al_as_size - partial : 0; integer += adjustment; ptr = reinterpret_cast(integer); // Remember the adjustment *(reinterpret_cast(ptr) - 1) = adjustment; return ptr; } void NonInterferingBase::operator delete(void *ptr, std::align_val_t al) { // Find the adjustment auto adjustment = *(reinterpret_cast(ptr) - 1); // Apply the adjustment auto p = reinterpret_cast(ptr) - adjustment - sizeof_align_val; // Call through to default operator ::operator delete(p); }