diff --git a/libraries/shared/src/DependencyManager.cpp b/libraries/shared/src/DependencyManager.cpp index c858cb7059..43bb92258e 100644 --- a/libraries/shared/src/DependencyManager.cpp +++ b/libraries/shared/src/DependencyManager.cpp @@ -17,8 +17,4 @@ DependencyManager& DependencyManager::getInstance() { } DependencyManager::~DependencyManager() { - foreach (Dependency* instance, _instanceHash) { - delete instance; - } - _instanceHash.clear(); } \ No newline at end of file diff --git a/libraries/shared/src/DependencyManager.h b/libraries/shared/src/DependencyManager.h index 87c7c7b4a6..455ec38bca 100644 --- a/libraries/shared/src/DependencyManager.h +++ b/libraries/shared/src/DependencyManager.h @@ -12,55 +12,48 @@ #ifndef hifi_DependencyManager_h #define hifi_DependencyManager_h -#include -#include +#include #include -#include + +#define SINGLETON_DEPENDENCY(T)\ +public:\ + typedef QSharedPointer SharedPointer;\ +private:\ + void customDeleter() { delete this; }\ + friend class DependencyManager; + +class QObject; class DependencyManager { public: // Only accessible method. // usage: T* instance = DependencyManager::get(); template - static T* get(); - - // Any class T in the DependencyManager needs to subclass Dependency - // They also need to have protected constructor(s) and virtual destructor - // As well as declare DependencyManager a friend class - class Dependency { - protected: - Dependency() {} - virtual ~Dependency() {} // Ensure the proper destruction of the object - friend DependencyManager; - }; + static QSharedPointer get(); private: static DependencyManager& getInstance(); DependencyManager() {} ~DependencyManager(); - typedef QHash InstanceHash; - static InstanceHash& getInstanceHash() { return getInstance()._instanceHash; } - InstanceHash _instanceHash; + static void noDelete(void*) {} }; template -T* DependencyManager::get() { - const QString& typeId = typeid(T).name(); +QSharedPointer DependencyManager::get() { + static QSharedPointer sharedPointer; + static T* instance = new T(); - // Search the hash for global instance - Dependency* instance = getInstanceHash().value(typeId, NULL); if (instance) { - return dynamic_cast(instance); + if (dynamic_cast(instance)) { // If this is a QOject, call deleteLater for destruction + sharedPointer = QSharedPointer(instance, &T::deleteLater); + } else { // Otherwise use custom deleter to avoid issues between private destructor and QSharedPointer + sharedPointer = QSharedPointer(instance, &T::customDeleter); + } + instance = NULL; } - - // Found no instance in hash so we create one. - T* newInstance = new T(); - instance = dynamic_cast(newInstance); - assert(instance != NULL); // If this triggers, check that T is derived from Dependency - getInstanceHash().insert(typeId, instance); - return newInstance; + return sharedPointer; } #endif // hifi_DependencyManager_h