From ca4517c076ecf5c8b648c32eb73d0cc47b6baf2d Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Mon, 23 Feb 2026 17:42:09 +0000 Subject: [PATCH] working weak ref WeakRefPtr now actually acts like a weak reference backend of weakRefPtr is now a weak_ptr so once the main shared_ptr is freed, they all get freed. --- Engine/source/T3D/assets/SoundAsset.cpp | 36 +++++---------- Engine/source/T3D/assets/SoundAsset.h | 12 ++--- Engine/source/console/simObject.h | 30 ++++--------- Engine/source/core/util/refBase.h | 60 +++++++++++++------------ 4 files changed, 56 insertions(+), 82 deletions(-) diff --git a/Engine/source/T3D/assets/SoundAsset.cpp b/Engine/source/T3D/assets/SoundAsset.cpp index f4882c50f..e8b6d3cdb 100644 --- a/Engine/source/T3D/assets/SoundAsset.cpp +++ b/Engine/source/T3D/assets/SoundAsset.cpp @@ -189,12 +189,6 @@ SoundAsset::SoundAsset() SoundAsset::~SoundAsset() { - - for (U32 i = 0; i < SFXPlayList::NUM_SLOTS; i++) - { - if(mSFXProfile[i].isProperlyAdded() && !mSFXProfile[i].isDeleted()) - mSFXProfile[i].unregisterObject(); - } if (mPlaylist.isProperlyAdded() && !mPlaylist.isDeleted()) mPlaylist.unregisterObject(); @@ -404,22 +398,17 @@ U32 SoundAsset::load() { Con::errorf("SoundAsset::initializeAsset: Attempted to load file %s but it was not valid!", mSoundFile[i]); mLoadedState = BadFileReference; - mSFXProfile[i].setDescription(NULL); - mSFXProfile[i].setSoundFileName(StringTable->insert(StringTable->EmptyString())); - mSFXProfile[i].setPreload(false); return mLoadedState; } else { - SFXProfile* trackProfile = new SFXProfile(); - trackProfile->setDescription(&mProfileDesc); - trackProfile->setSoundFileName(mSoundPath[i]); - trackProfile->setPreload(mPreload); + mSFXProfile[i] = new SFXProfile; + mSFXProfile[i]->setDescription(&mProfileDesc); + mSFXProfile[i]->setSoundFileName(mSoundPath[i]); + mSFXProfile[i]->setPreload(mPreload); + mSFXProfile[i]->registerObject(String::ToString("%s_profile_track%d", getAssetName()).c_str()); - mSFXProfile[i] = *trackProfile; - mSFXProfile[i].registerObject(String::ToString("%s_profile_track%d", getAssetName()).c_str()); - - mPlaylist.mSlots.mTrack[i] = trackProfile; + mPlaylist.mSlots.mTrack[i] = mSFXProfile[i]; } } @@ -436,18 +425,15 @@ U32 SoundAsset::load() { Con::errorf("SoundAsset::initializeAsset: Attempted to load file %s but it was not valid!", mSoundFile[0]); mLoadedState = BadFileReference; - mSFXProfile[0].setDescription(NULL); - mSFXProfile[0].setSoundFileName(StringTable->insert(StringTable->EmptyString())); - mSFXProfile[0].setPreload(false); return mLoadedState; } else { - mSFXProfile[0].setDescription(&mProfileDesc); - mSFXProfile[0].setSoundFileName(mSoundPath[0]); - mSFXProfile[0].setPreload(mPreload); - - mSFXProfile[0].registerObject(String::ToString("%s_profile", getAssetName()).c_str()); + mSFXProfile[0] = new SFXProfile; + mSFXProfile[0]->setDescription(&mProfileDesc); + mSFXProfile[0]->setSoundFileName(mSoundPath[0]); + mSFXProfile[0]->setPreload(mPreload); + mSFXProfile[0]->registerObject(String::ToString("%s_profile", getAssetName()).c_str()); } } diff --git a/Engine/source/T3D/assets/SoundAsset.h b/Engine/source/T3D/assets/SoundAsset.h index 1def01066..d005ec0c1 100644 --- a/Engine/source/T3D/assets/SoundAsset.h +++ b/Engine/source/T3D/assets/SoundAsset.h @@ -87,9 +87,9 @@ class SoundAsset : public AssetBase typedef AssetPtr ConcreteAssetPtr; protected: - StringTableEntry mSoundFile[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS]; - StringTableEntry mSoundPath[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS]; - SFXProfile mSFXProfile[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS]; + StringTableEntry mSoundFile[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS]; + StringTableEntry mSoundPath[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS]; + SimObjectPtr mSFXProfile[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS]; SFXDescription mProfileDesc; SFXPlayList mPlaylist; @@ -150,7 +150,7 @@ public: void copyTo(SimObject* object) override; //SFXResource* getSound() { return mSoundResource; } - Resource getSoundResource(const U32 slotId = 0) { load(); return mSFXProfile[slotId].getResource(); } + Resource getSoundResource(const U32 slotId = 0) { load(); return mSFXProfile[slotId]->getResource(); } /// Declare Console Object. DECLARE_CONOBJECT(SoundAsset); @@ -158,9 +158,9 @@ public: static bool _setSoundFile(void* object, const char* index, const char* data); U32 load() override; inline StringTableEntry getSoundPath(const U32 slotId = 0) const { return mSoundPath[slotId]; }; - SFXProfile* getSfxProfile(const U32 slotId = 0) { return &mSFXProfile[slotId]; } + SFXProfile* getSfxProfile(const U32 slotId = 0) { return mSFXProfile[slotId]; } SFXPlayList* getSfxPlaylist() { return &mPlaylist; } - SFXTrack* getSFXTrack() { load(); return mIsPlaylist ? dynamic_cast(&mPlaylist) : dynamic_cast(&mSFXProfile[0]); } + SFXTrack* getSFXTrack() { load(); return mIsPlaylist ? dynamic_cast(&mPlaylist) : dynamic_cast(mSFXProfile[0].getPointer()); } SFXDescription* getSfxDescription() { return &mProfileDesc; } bool isPlaylist(){ return mIsPlaylist; } diff --git a/Engine/source/console/simObject.h b/Engine/source/console/simObject.h index e7340df6e..21f5949b8 100644 --- a/Engine/source/console/simObject.h +++ b/Engine/source/console/simObject.h @@ -1054,30 +1054,16 @@ public: typedef WeakRefPtr< T > Parent; SimObjectPtr() = default; - SimObjectPtr(T *ptr) { set(ptr); } - SimObjectPtr( const SimObjectPtr& ref ) { this->mReference = ref.mReference; } + SimObjectPtr(T* ptr) : Parent(ptr) {} + SimObjectPtr(const SimObjectPtr&) = default; + SimObjectPtr& operator=(const SimObjectPtr&) = default; + SimObjectPtr& operator=(T* ptr) + { + Parent::operator=(ptr); + return *this; + } T* getObject() const { return Parent::getPointer(); } - - ~SimObjectPtr() { this->mReference = NULL; } - - SimObjectPtr& operator=(const SimObjectPtr ref) - { - this->mReference = ref.mReference; - return *this; - } - SimObjectPtr& operator=(T *ptr) - { - set(ptr); - return *this; - } - -protected: - - void set(T * obj) - { - this->mReference = obj ? obj->getWeakReference() : NULL; - } }; #endif // _SIMOBJECT_H_ diff --git a/Engine/source/core/util/refBase.h b/Engine/source/core/util/refBase.h index 694a4cfa8..e5842c639 100644 --- a/Engine/source/core/util/refBase.h +++ b/Engine/source/core/util/refBase.h @@ -79,22 +79,10 @@ public: virtual ~WeakRefBase(); // Copy constructor - WeakRefBase(const WeakRefBase& other) - { - mControl = other.mControl; - mReference = std::make_unique(mControl); - } - - // Copy assignment - WeakRefBase& operator=(const WeakRefBase& other) - { - if (this != &other) - { - mControl = other.mControl; - mReference = std::make_unique(mControl); - } - return *this; - } + WeakRefBase(const WeakRefBase&) = delete; + WeakRefBase& operator=(const WeakRefBase&) = delete; + WeakRefBase(WeakRefBase&&) = delete; + WeakRefBase& operator=(WeakRefBase&&) = delete; std::shared_ptr getWeakReference() { @@ -103,6 +91,12 @@ public: return mReference; } + std::weak_ptr getWeakControl() + { + ensureControl(); + return mControl; + } + protected: void ensureControl() @@ -127,15 +121,11 @@ template< typename T > class SimObjectPtr; template class WeakRefPtr { public: - WeakRefPtr() = default; - WeakRefPtr(T* obj) { set(obj); } - WeakRefPtr(const WeakRefPtr& other) { mReference = other.mReference; } + WeakRefPtr() = default; + WeakRefPtr(T* obj) { set(obj); } - WeakRefPtr& operator=(const WeakRefPtr& other) - { - mReference = other.mReference; - return *this; - } + WeakRefPtr(const WeakRefPtr&) = default; + WeakRefPtr& operator=(const WeakRefPtr&) = default; WeakRefPtr& operator=(T* obj) { @@ -143,24 +133,36 @@ public: return *this; } - bool isValid() const { return mReference && mReference->get(); } - bool isNull() const { return !isValid(); } + bool isValid() const { return getPointer() != NULL; } + bool isNull() const { return getPointer() == NULL; } [[nodiscard]] constexpr T* operator->() const { return getPointer(); } [[nodiscard]] constexpr T& operator*() const { return *getPointer(); } [[nodiscard]] constexpr operator T*() const { return getPointer(); } /// Returns the pointer. - [[nodiscard]] constexpr T* getPointer() const { return mReference ? (T*)mReference->get() : NULL; } + [[nodiscard]] constexpr T* getPointer() const + { + auto obj_ctrl = mWeak.lock(); + if (!obj_ctrl) return NULL; + return (T*)obj_ctrl->object; + } protected: void set(T* obj) { - mReference = obj ? obj->getWeakReference() : NULL; + if (!obj) + { + mWeak.reset(); + return; + } + + auto obj_ctrl = obj->getWeakControl().lock(); + mWeak = obj_ctrl; } private: template< typename > friend class SimObjectPtr; - std::shared_ptr mReference; + std::weak_ptr mWeak; }; /// Union of an arbitrary type with a WeakRefBase. The exposed type will