diff --git a/libraries/shared/src/DependencyManager.cpp b/libraries/shared/src/DependencyManager.cpp index b8fbcad490..e56dd0df88 100644 --- a/libraries/shared/src/DependencyManager.cpp +++ b/libraries/shared/src/DependencyManager.cpp @@ -26,8 +26,3 @@ QSharedPointer DependencyManager::safeGet(size_t hashCode) const { return _instanceHash.value(hashCode); } -void DependencyManager::safeSet(size_t hashCode, const QSharedPointer& value) { - QMutexLocker lock(&_instanceHashMutex); - _instanceHash.insert(hashCode, value); -} - diff --git a/libraries/shared/src/DependencyManager.h b/libraries/shared/src/DependencyManager.h index 90b0888185..e188c8e9a4 100644 --- a/libraries/shared/src/DependencyManager.h +++ b/libraries/shared/src/DependencyManager.h @@ -85,7 +85,6 @@ private: size_t getHashCode() const; QSharedPointer safeGet(size_t hashCode) const; - void safeSet(size_t hashCode, const QSharedPointer& value); QHash> _instanceHash; QHash _inheritanceHash; @@ -133,8 +132,16 @@ bool DependencyManager::isSet() { template QSharedPointer DependencyManager::set(Args&&... args) { static size_t hashCode = manager().getHashCode(); + QMutexLocker lock(&manager()._instanceHashMutex); + + // clear the previous instance before constructing the new instance + auto iter = manager()._instanceHash.find(hashCode); + if (iter != manager()._instanceHash.end()) { + iter.value().clear(); + } + QSharedPointer newInstance(new T(args...), &T::customDeleter); - manager().safeSet(hashCode, newInstance); + manager()._instanceHash.insert(hashCode, newInstance); return newInstance; } @@ -142,8 +149,16 @@ QSharedPointer DependencyManager::set(Args&&... args) { template QSharedPointer DependencyManager::set(Args&&... args) { static size_t hashCode = manager().getHashCode(); + QMutexLocker lock(&manager()._instanceHashMutex); + + // clear the previous instance before constructing the new instance + auto iter = manager()._instanceHash.find(hashCode); + if (iter != manager()._instanceHash.end()) { + iter.value().clear(); + } + QSharedPointer newInstance(new I(args...), &I::customDeleter); - manager().safeSet(hashCode, newInstance); + _instanceHash.insert(hashCode, newInstance); return newInstance; }