mirror of
https://github.com/cookiengineer/audacity
synced 2025-04-30 15:49:41 +02:00
... Fixing many conditional operators with explicit construction of wxString instead of simple string literals; And fixing allocation of more strictly aligned structures on Mac, without need for 10.14 as the minimum SDK, by means of some class-specific operators new and delete.
59 lines
1.7 KiB
C++
59 lines
1.7 KiB
C++
/**********************************************************************
|
|
|
|
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()
|
|
{}
|
|
|
|
#ifdef __APPLE__
|
|
|
|
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<align_val_t>( alignof(align_val_t) ) );
|
|
const auto al_as_size = static_cast<size_t>(al);
|
|
auto ptr = static_cast<char*>(
|
|
::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<uintptr_t>(ptr);
|
|
const auto partial = integer % al_as_size;
|
|
auto adjustment = partial ? al_as_size - partial : 0;
|
|
integer += adjustment;
|
|
ptr = reinterpret_cast<char*>(integer);
|
|
|
|
// Remember the adjustment
|
|
*(reinterpret_cast<size_t*>(ptr) - 1) = adjustment;
|
|
|
|
return ptr;
|
|
}
|
|
|
|
void NonInterferingBase::operator delete(void *ptr, std::align_val_t al)
|
|
{
|
|
// Find the adjustment
|
|
auto adjustment = *(reinterpret_cast<size_t*>(ptr) - 1);
|
|
// Apply the adjustment
|
|
auto p = reinterpret_cast<char*>(ptr) - adjustment - sizeof_align_val;
|
|
// Call through to default operator
|
|
::operator delete(p);
|
|
}
|
|
|
|
#endif
|