From f1f09efbfaecb78ec2c9a84d0e0b452023c64402 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 22 Feb 2026 00:02:20 +0000 Subject: [PATCH] backup WeakRefBase is now threadsafe and uses an actual weak_ptr to drive its logic, strongrefbase is next. --- Engine/source/console/simManager.cpp | 29 +++-- Engine/source/console/simObject.cpp | 5 +- Engine/source/console/simObject.h | 1 + Engine/source/core/util/refBase.cpp | 17 +++ Engine/source/core/util/refBase.h | 115 +++++++++++------- Engine/source/gui/controls/guiPopUpCtrlEx.cpp | 15 ++- 6 files changed, 120 insertions(+), 62 deletions(-) create mode 100644 Engine/source/core/util/refBase.cpp diff --git a/Engine/source/console/simManager.cpp b/Engine/source/console/simManager.cpp index 0a91cf262..8a2c50e0b 100644 --- a/Engine/source/console/simManager.cpp +++ b/Engine/source/console/simManager.cpp @@ -290,6 +290,7 @@ static void initRoot() gNameDictionary = new SimManagerNameDictionary; sgStreamingInstance = new SceneStreaming; sgStreamingInstance->smStreaming = false; + gRootGroup = new SimGroup(); gRootGroup->incRefCount(); @@ -631,20 +632,28 @@ void SimDataBlockGroup::sort() void SceneStreaming::processTick() { - if (true) + if (smPendingRegister.empty()) + return; + + U32 start = Platform::getRealMilliseconds(); + + while (!smPendingRegister.empty()) { - for (U32 i = 0; i < mMaxObjects && !smPendingRegister.empty(); i++) - { - SimObject* obj = smPendingRegister.first(); - smPendingRegister.pop_front(); + SimObject* obj = smPendingRegister.first(); + smPendingRegister.pop_front(); - Sim::gIdDictionary->insert(obj); + Sim::gIdDictionary->insert(obj); - Sim::gNameDictionary->insert(obj); + Sim::gNameDictionary->insert(obj); - if (!obj->onAdd()) - obj->unregisterObject(); - } + if (!obj->onAdd()) + obj->unregisterObject(); + + U32 now = Platform::getRealMilliseconds(); + if ((now - start) >= 2) + break; + } + } diff --git a/Engine/source/console/simObject.cpp b/Engine/source/console/simObject.cpp index 41ec9c8a4..3a95a07d0 100644 --- a/Engine/source/console/simObject.cpp +++ b/Engine/source/console/simObject.cpp @@ -46,6 +46,7 @@ #include "scene/sceneObject.h" #include "T3D/camera.h" #include "T3D/player.h" +#include "T3D/gameBase/gameConnection.h" ImplementBitfieldType(GameTypeMasksType, "The type of animation effect to apply to this material.\n" @@ -725,9 +726,7 @@ bool SimObject::registerObject() AssertFatal(Sim::gIdDictionary && Sim::gNameDictionary, "SimObject::registerObject - tried to register an object before Sim::init()!"); - - if (true && dynamic_cast(this) && - !(dynamic_cast(this) || dynamic_cast(this)) && + if (Sim::sgStreamingInstance->smStreaming && dynamic_cast(this) && !gEditingMission ) { diff --git a/Engine/source/console/simObject.h b/Engine/source/console/simObject.h index 57e5a39e4..b056907da 100644 --- a/Engine/source/console/simObject.h +++ b/Engine/source/console/simObject.h @@ -609,6 +609,7 @@ class SimObject: public ConsoleObject, public TamlCallbacks /// @name Events /// @{ + //virtual void onPrepare(); /// Called when the object is added to the sim. virtual bool onAdd(); diff --git a/Engine/source/core/util/refBase.cpp b/Engine/source/core/util/refBase.cpp new file mode 100644 index 000000000..833c89530 --- /dev/null +++ b/Engine/source/core/util/refBase.cpp @@ -0,0 +1,17 @@ +#include "refBase.h" + +WeakRefBase::~WeakRefBase() +{ + if (mControl) + mControl->object = nullptr; +} + +WeakControlBlock::WeakControlBlock(WeakRefBase* obj) + : object(obj) +{ +} + +WeakControlBlock::~WeakControlBlock() +{ + +} diff --git a/Engine/source/core/util/refBase.h b/Engine/source/core/util/refBase.h index 42ce6705d..bc5149e89 100644 --- a/Engine/source/core/util/refBase.h +++ b/Engine/source/core/util/refBase.h @@ -29,7 +29,17 @@ #ifndef _TYPETRAITS_H_ # include "platform/typetraits.h" #endif +#include +class WeakRefBase; + +struct WeakControlBlock +{ + explicit WeakControlBlock(WeakRefBase* obj); + ~WeakControlBlock(); + + WeakRefBase* object; +}; /// Base class for objects which can be weakly referenced /// (i.e., reference goes away when object is destroyed). @@ -37,45 +47,56 @@ class WeakRefBase { public: - /// Weak reference to WeakRefBase. class WeakReference { public: - [[nodiscard]] constexpr WeakRefBase* get() const { return mObject; } - [[nodiscard]] constexpr U32 getRefCount() const { return mRefCount; } - - constexpr void incRefCount() { mRefCount++; } - constexpr void decRefCount() { - AssertFatal( mRefCount > 0, "WeakReference - decrementing count of zero!" ); - if (--mRefCount==0) - delete this; + WeakRefBase* get() const + { + auto locked = mWeak.lock(); + return locked ? locked->object : NULL; } + + uint32_t getRefCount() const + { + return (uint32_t)mWeak.use_count(); + } + + void incRefCount() { /* compatibility no-op */ } + void decRefCount() { /* compatibility no-op */ } + private: - friend class WeakRefBase; - constexpr explicit WeakReference(WeakRefBase *object) :mObject(object), mRefCount(0) {} - ~WeakReference() { AssertFatal(mObject==NULL, "Deleting weak reference which still points at an object."); } + explicit WeakReference(const std::shared_ptr& ctrl) + : mWeak(ctrl) { + } - // Object we reference - WeakRefBase *mObject; - - // reference count for this structure (not WeakObjectRef itself) - U32 mRefCount; + std::weak_ptr mWeak; }; public: - constexpr WeakRefBase() : mReference(NULL) {} - virtual ~WeakRefBase() { clearWeakReferences(); } + constexpr WeakRefBase() {} + virtual ~WeakRefBase(); - WeakReference* getWeakReference(); + WeakReference* getWeakReference() + { + ensureControl(); + return new WeakReference(mControl); + } protected: - void clearWeakReferences(); + void ensureControl() + { + if (!mControl) + mControl = std::shared_ptr(new WeakControlBlock(this)); + } + + std::shared_ptr mControl; private: - WeakReference * mReference; + + }; template< typename T > class SimObjectPtr; @@ -192,7 +213,12 @@ class StrongRefBase : public WeakRefBase friend class StrongObjectRef; public: - StrongRefBase() { mRefCount = 0; } + StrongRefBase() + { + mRefCount = 0; + ensureControl(); + mStrongControlRef = mControl; + } U32 getRefCount() const { return mRefCount; } @@ -209,12 +235,13 @@ public: void decRefCount() { AssertFatal(mRefCount, "Decrementing a reference with refcount 0!"); - if(!--mRefCount) + if (!--mRefCount) destroySelf(); } protected: U32 mRefCount; ///< reference counter for StrongRefPtr objects + std::shared_ptr mStrongControlRef; }; /// Base class for StrongRefBase strong reference pointers. @@ -415,27 +442,25 @@ private: }; //--------------------------------------------------------------- - -inline void WeakRefBase::clearWeakReferences() -{ - if (mReference) - { - mReference->mObject = NULL; - mReference->decRefCount(); - mReference = NULL; - } -} - -inline WeakRefBase::WeakReference* WeakRefBase::getWeakReference() -{ - if (!mReference) - { - mReference = new WeakReference(this); - mReference->incRefCount(); - } - return mReference; -} - +//inline void WeakRefBase::clearWeakReferences() +//{ +// if (mReference) +// { +// mReference->mObject = NULL; +// mReference->decRefCount(); +// mReference = NULL; +// } +//} +// +//inline WeakRefBase::WeakReference* WeakRefBase::getWeakReference() +//{ +// if (!mReference) +// { +// mReference = new WeakReference(this); +// mReference->incRefCount(); +// } +// return mReference; +//} //--------------------------------------------------------------- template< typename T > diff --git a/Engine/source/gui/controls/guiPopUpCtrlEx.cpp b/Engine/source/gui/controls/guiPopUpCtrlEx.cpp index e7bacb4f3..f064a7f09 100644 --- a/Engine/source/gui/controls/guiPopUpCtrlEx.cpp +++ b/Engine/source/gui/controls/guiPopUpCtrlEx.cpp @@ -1651,10 +1651,17 @@ void GuiPopUpMenuCtrlEx::addChildren() void GuiPopUpMenuCtrlEx::removeChildren() { - mTl->deleteObject(); - mSc->deleteObject(); - mSearchEdit->deleteObject(); - mBackground->deleteObject(); + if (mTl && !mTl->isDeleted()) + mTl->deleteObject(); + + if (mSc && !mSc->isDeleted()) + mSc->deleteObject(); + + if (mSearchEdit && !mSearchEdit->isDeleted()) + mSearchEdit->deleteObject(); + + if (mBackground && !mBackground->isDeleted()) + mBackground->deleteObject(); } //------------------------------------------------------------------------------