diff options
author | Chris Robinson <[email protected]> | 2024-01-01 15:54:30 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2024-01-01 15:54:30 -0800 |
commit | 70a8cf88041d88c49dcd258587e6b84960752851 (patch) | |
tree | 50acfdf6587a68e985aa713567b2e997cb5eef4f /core | |
parent | 936e654b261b4d1cb604a44da534ba385aa10099 (diff) |
Use an atomic unique_ptr for the device's context array
Diffstat (limited to 'core')
-rw-r--r-- | core/device.cpp | 12 | ||||
-rw-r--r-- | core/device.h | 7 |
2 files changed, 4 insertions, 15 deletions
diff --git a/core/device.cpp b/core/device.cpp index a5edf63c..795a9601 100644 --- a/core/device.cpp +++ b/core/device.cpp @@ -12,15 +12,9 @@ static_assert(std::atomic<std::chrono::nanoseconds>::is_always_lock_free); -al::FlexArray<ContextBase*> DeviceBase::sEmptyContextArray{0u}; - - -DeviceBase::DeviceBase(DeviceType type) : Type{type}, mContexts{&sEmptyContextArray} +DeviceBase::DeviceBase(DeviceType type) + : Type{type}, mContexts{al::FlexArray<ContextBase*>::Create(0)} { } -DeviceBase::~DeviceBase() -{ - auto *oldarray = mContexts.exchange(nullptr, std::memory_order_relaxed); - if(oldarray != &sEmptyContextArray) delete oldarray; -} +DeviceBase::~DeviceBase() = default; diff --git a/core/device.h b/core/device.h index 9ee07454..1da08727 100644 --- a/core/device.h +++ b/core/device.h @@ -181,11 +181,6 @@ enum class DeviceState : uint8_t { }; struct DeviceBase { - /* To avoid extraneous allocations, a 0-sized FlexArray<ContextBase*> is - * defined globally as a sharable object. - */ - static al::FlexArray<ContextBase*> sEmptyContextArray; - std::atomic<bool> Connected{true}; const DeviceType Type{}; @@ -295,7 +290,7 @@ struct DeviceBase { std::atomic<uint> mMixCount{0u}; // Contexts created on this device - std::atomic<al::FlexArray<ContextBase*>*> mContexts{nullptr}; + al::atomic_unique_ptr<al::FlexArray<ContextBase*>> mContexts; DeviceBase(DeviceType type); |