[*] Ensure shared pointers aren't freed between conflicting default heaps
This commit is contained in:
parent
f6bcade29c
commit
bea0f5c8f2
@ -88,3 +88,7 @@
|
|||||||
//#define _AURORA_AVOID_DUMB_STL_TYPES
|
//#define _AURORA_AVOID_DUMB_STL_TYPES
|
||||||
|
|
||||||
#define _AURORA_AVOID_EXTREMLY_DUMB_STL_TYPES
|
#define _AURORA_AVOID_EXTREMLY_DUMB_STL_TYPES
|
||||||
|
// TODO:
|
||||||
|
#if !defined(_AURORA_NULLEXPT_BRANCH)
|
||||||
|
#define _AURORA_NULLEXPT_BRANCH
|
||||||
|
#endif
|
@ -369,20 +369,6 @@ namespace Aurora::Memory
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auline void throwif()
|
|
||||||
{
|
|
||||||
if (!cached) [[unlikely]]
|
|
||||||
{
|
|
||||||
#if defined(_AURORA_NULLEXPT_BRANCH_BUG_CHECK)
|
|
||||||
cached = Base_t::operator bool();
|
|
||||||
if (!cached) [[likely]]
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
AU_THROW_STRING("ExSharedPointer Null Access Violation");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auline void _cache()
|
auline void _cache()
|
||||||
{
|
{
|
||||||
cached = Base_t::operator bool();
|
cached = Base_t::operator bool();
|
||||||
|
@ -27,13 +27,6 @@ using AuWPtr = AURORA_RUNTIME_AU_WEAK_PTR<T>;
|
|||||||
#define AURORA_RUNTIME_AU_UNIQUE_PTR std::unique_ptr
|
#define AURORA_RUNTIME_AU_UNIQUE_PTR std::unique_ptr
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(AURORA_RUNTIME_AU_DEFAULT_DELETER)
|
|
||||||
#define AURORA_RUNTIME_AU_DEFAULT_DELETER std::default_delete
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
using AuDefaultDeleter = AURORA_RUNTIME_AU_DEFAULT_DELETER<T>;
|
|
||||||
|
|
||||||
#include "STLShims/ExtendStlLikeSharedPtr.hpp"
|
#include "STLShims/ExtendStlLikeSharedPtr.hpp"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
@ -66,111 +59,6 @@ static auline void AuMemoryPanic(const char *msg)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T, typename... Args>
|
|
||||||
static auline AuSPtr<T> AuMakeShared(Args&&... args)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return AURORA_RUNTIME_MAKE_SHARED<T>(AuForward<Args>(args)...);
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T, typename... Args>
|
|
||||||
static auline AuSPtr<T> AuMakeSharedPanic(Args&&... args)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
auto pShared = AURORA_RUNTIME_MAKE_SHARED<T>(AuForward<Args>(args)...);
|
|
||||||
if (!pShared)
|
|
||||||
{
|
|
||||||
AuMemoryPanic("Failed to allocate <X>"); // TODO: non-rtti typename
|
|
||||||
}
|
|
||||||
|
|
||||||
return pShared;
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
AuMemoryPanic("Failed to allocate <X>"); // TODO: non-rtti typename
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T, typename... Args>
|
|
||||||
static auline AuSPtr<T> AuMakeSharedThrow(Args&&... args)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
auto pShared = AURORA_RUNTIME_MAKE_SHARED<T>(AuForward<Args>(args)...);
|
|
||||||
if (!pShared)
|
|
||||||
{
|
|
||||||
// TODO: Agnostic SysPushErrorMemory
|
|
||||||
AU_THROW_STRING("Failed to allocate <X>"); // TODO: non-rtti typename
|
|
||||||
}
|
|
||||||
|
|
||||||
return pShared;
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
// TODO: Agnostic SysPushErrorCatch
|
|
||||||
AU_THROW_STRING("Failed to allocate <X>"); // TODO: non-rtti typename
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace __audetail
|
|
||||||
{
|
|
||||||
struct Dummy
|
|
||||||
{
|
|
||||||
char a;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline AuSPtr<Dummy> GetDummyDeleter()
|
|
||||||
{
|
|
||||||
static AuSPtr<Dummy> d;
|
|
||||||
if (!d)
|
|
||||||
{
|
|
||||||
#if defined(AURORA_COMPILER_MSVC)
|
|
||||||
return d;
|
|
||||||
#endif
|
|
||||||
d = AuMakeShared<Dummy>();
|
|
||||||
}
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
static auline AuSPtr<T> AuMakeSharedArray(AuUInt count)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
#if defined(AU_LANG_CPP_20) && 0
|
|
||||||
return AURORA_RUNTIME_AU_SHARED_PTR<T[]>(count);
|
|
||||||
#else
|
|
||||||
return AURORA_RUNTIME_AU_SHARED_PTR<T>(new T[count], AuDefaultDeleter<T[]>());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
static AuSPtr<T> AuUnsafeRaiiToShared(T *in)
|
|
||||||
{
|
|
||||||
return AuSPtr<T>(__audetail::GetDummyDeleter(), in);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T, class Z>
|
|
||||||
static AuSPtr<T> AuUnsafeRaiiToShared(const AuUPtr<T, Z> &in)
|
|
||||||
{
|
|
||||||
return AuUnsafeRaiiToShared(in.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T, AuUInt Z>
|
template <class T, AuUInt Z>
|
||||||
static constexpr AuUInt AuArraySize(const T(&array)[Z])
|
static constexpr AuUInt AuArraySize(const T(&array)[Z])
|
||||||
{
|
{
|
||||||
@ -240,6 +128,9 @@ static void auline AuSafeDelete(T *in)
|
|||||||
delete static_cast<Z>(in);
|
delete static_cast<Z>(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(AURORA_RUNTIME_AU_DEFAULT_DELETER)
|
||||||
|
#define AURORA_RUNTIME_AU_DEFAULT_DELETER std::default_delete
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO: Move me
|
// TODO: Move me
|
||||||
#include "auOptional.hpp"
|
#include "auOptional.hpp"
|
||||||
@ -274,13 +165,12 @@ namespace Aurora::Memory
|
|||||||
|
|
||||||
AU_COPY_MOVE(BaseAuroraRuntimeAllocator)
|
AU_COPY_MOVE(BaseAuroraRuntimeAllocator)
|
||||||
|
|
||||||
constexpr BaseAuroraRuntimeAllocator()
|
constexpr BaseAuroraRuntimeAllocator() noexcept
|
||||||
{}
|
{ }
|
||||||
|
|
||||||
template <class U>
|
template <class U>
|
||||||
constexpr BaseAuroraRuntimeAllocator(const BaseAuroraRuntimeAllocator <U> &) noexcept
|
constexpr BaseAuroraRuntimeAllocator(const BaseAuroraRuntimeAllocator <U> &) noexcept
|
||||||
{
|
{ }
|
||||||
}
|
|
||||||
|
|
||||||
void *allocate_bytes(std::size_t nbytes,
|
void *allocate_bytes(std::size_t nbytes,
|
||||||
std::size_t alignment = alignof(std::max_align_t))
|
std::size_t alignment = alignof(std::max_align_t))
|
||||||
@ -386,17 +276,208 @@ namespace Aurora::Memory
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using PrimitiveArrayAllocator = BaseAuroraRuntimeAllocator<T>;
|
using PrimitiveArrayAllocator = BaseAuroraRuntimeAllocator<T>;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using ClassArrayAllocator = BaseAuroraRuntimeAllocator<T>;
|
using ClassArrayAllocator = BaseAuroraRuntimeAllocator<T>;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using StringAllocator = BaseAuroraRuntimeAllocator<T>;
|
using StringAllocator = BaseAuroraRuntimeAllocator<T>;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
using SharedControlBlockAllocator = BaseAuroraRuntimeAllocator<T>;
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct DefaultRuntimeDeleter
|
||||||
|
{
|
||||||
|
constexpr DefaultRuntimeDeleter() noexcept = default;
|
||||||
|
|
||||||
|
template <class Z>
|
||||||
|
DefaultRuntimeDeleter(const DefaultRuntimeDeleter<Z> &) noexcept
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void operator()(T *pThat) const
|
||||||
|
{
|
||||||
|
if constexpr (AuIsClass_v<T> &&
|
||||||
|
!AuIsTriviallyDestructible_v<T>)
|
||||||
|
{
|
||||||
|
pThat->~T();
|
||||||
|
}
|
||||||
|
|
||||||
|
Aurora::Memory::__Free(pThat);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct DefaultRuntimeDeleter<T[]>
|
||||||
|
{
|
||||||
|
constexpr DefaultRuntimeDeleter() noexcept = default;
|
||||||
|
|
||||||
|
template <class Z>
|
||||||
|
DefaultRuntimeDeleter(const DefaultRuntimeDeleter<Z> &) noexcept
|
||||||
|
{ }
|
||||||
|
|
||||||
|
template <class Z>
|
||||||
|
void operator()(Z *pThat) const
|
||||||
|
{
|
||||||
|
AURORA_RUNTIME_AU_DEFAULT_DELETER<T[]>()(pThat);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(AURORA_ROXTL_ALLOCATORS_USE_STD)
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
using AuDefaultDeleter = AURORA_RUNTIME_AU_DEFAULT_DELETER<T>;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
using AuDefaultDeleter = Aurora::Memory::DefaultRuntimeDeleter<T>;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <class T, typename... Args>
|
||||||
|
static auline AuSPtr<T> AuMakeShared(Args&&... args)
|
||||||
|
{
|
||||||
|
using Z = AuRemoveConst_t<T>;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
#if defined(AURORA_ROXTL_ALLOCATORS_USE_STD)
|
||||||
|
return AURORA_RUNTIME_MAKE_SHARED<T>(AuForward<Args>(args)...);
|
||||||
|
#else
|
||||||
|
auto pNext = Aurora::Memory::__FAlloc(sizeof(T), alignof(T));
|
||||||
|
if (!pNext)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto pNextClass = (Z *)pNext;
|
||||||
|
new (pNextClass) Z (AuForward<Args>(args)...);
|
||||||
|
return std::shared_ptr<T>(pNextClass, Aurora::Memory::DefaultRuntimeDeleter<Z> {}, Aurora::Memory::SharedControlBlockAllocator<T> {});
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, typename... Args>
|
||||||
|
static auline AuSPtr<T> AuMakeSharedPanic(Args&&... args)
|
||||||
|
{
|
||||||
|
#if defined(AURORA_ROXTL_ALLOCATORS_USE_STD)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto pShared = AURORA_RUNTIME_MAKE_SHARED<T>(AuForward<Args>(args)...);
|
||||||
|
if (!pShared)
|
||||||
|
{
|
||||||
|
AuMemoryPanic("Failed to allocate <X>"); // TODO: non-rtti typename
|
||||||
|
}
|
||||||
|
|
||||||
|
return pShared;
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
AuMemoryPanic("Failed to allocate <X>"); // TODO: non-rtti typename
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
auto pShared = AuMakeShared<T>(AuForward<Args>(args)...);
|
||||||
|
if (!pShared)
|
||||||
|
{
|
||||||
|
AuMemoryPanic("Failed to allocate <X>"); // TODO: non-rtti typename
|
||||||
|
}
|
||||||
|
|
||||||
|
return pShared;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, typename... Args>
|
||||||
|
static auline AuSPtr<T> AuMakeSharedThrow(Args&&... args)
|
||||||
|
{
|
||||||
|
#if defined(AURORA_ROXTL_ALLOCATORS_USE_STD)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto pShared = AURORA_RUNTIME_MAKE_SHARED<T>(AuForward<Args>(args)...);
|
||||||
|
if (!pShared)
|
||||||
|
{
|
||||||
|
// TODO: Agnostic SysPushErrorMemory
|
||||||
|
AU_THROW_STRING("Failed to allocate <X>"); // TODO: non-rtti typename
|
||||||
|
}
|
||||||
|
|
||||||
|
return pShared;
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
// TODO: Agnostic SysPushErrorCatch
|
||||||
|
AU_THROW_STRING("Failed to allocate <X>"); // TODO: non-rtti typename
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
auto pShared = AuMakeShared<T>(AuForward<Args>(args)...);
|
||||||
|
if (!pShared)
|
||||||
|
{
|
||||||
|
AU_THROW_STRING("Failed to allocate <X>"); // TODO: non-rtti typename
|
||||||
|
}
|
||||||
|
|
||||||
|
return pShared;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static auline AuSPtr<T> AuMakeSharedArray(AuUInt count)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
#if defined(AU_LANG_CPP_20) && 0
|
||||||
|
return AURORA_RUNTIME_AU_SHARED_PTR<T[]>(count);
|
||||||
|
#else
|
||||||
|
return AURORA_RUNTIME_AU_SHARED_PTR<T>(new T[count], AURORA_RUNTIME_AU_DEFAULT_DELETER<T[]>());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace __audetail
|
||||||
|
{
|
||||||
|
struct Dummy
|
||||||
|
{
|
||||||
|
char a;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline AuSPtr<Dummy> GetDummyDeleter()
|
||||||
|
{
|
||||||
|
static AuSPtr<Dummy> d;
|
||||||
|
if (!d)
|
||||||
|
{
|
||||||
|
#if defined(AURORA_COMPILER_MSVC)
|
||||||
|
return d;
|
||||||
|
#endif
|
||||||
|
d = AuMakeShared<Dummy>();
|
||||||
|
}
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static AuSPtr<T> AuUnsafeRaiiToShared(T *in)
|
||||||
|
{
|
||||||
|
return AuSPtr<T>(__audetail::GetDummyDeleter(), in);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class Z>
|
||||||
|
static AuSPtr<T> AuUnsafeRaiiToShared(const AuUPtr<T, Z> &in)
|
||||||
|
{
|
||||||
|
return AuUnsafeRaiiToShared(in.get());
|
||||||
|
}
|
||||||
|
|
||||||
template <class T, class Z>
|
template <class T, class Z>
|
||||||
inline constexpr bool operator==(const Aurora::Memory::BaseAuroraRuntimeAllocator<T> &lhs,
|
inline constexpr bool operator==(const Aurora::Memory::BaseAuroraRuntimeAllocator<T> &lhs,
|
||||||
const Aurora::Memory::BaseAuroraRuntimeAllocator<Z> &rhs) noexcept
|
const Aurora::Memory::BaseAuroraRuntimeAllocator<Z> &rhs) noexcept
|
||||||
|
Loading…
Reference in New Issue
Block a user