From df5fcc35818793d2d750b4ed1a8088926cdb7443 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 6 Apr 2016 14:42:36 -0400 Subject: [PATCH] Make static "Destroy" methods for certain singletons unnecessary. --- include/audacity/ModuleInterface.h | 1 - include/audacity/PluginInterface.h | 1 - src/AudacityApp.cpp | 4 ---- src/DeviceManager.cpp | 6 ------ src/DeviceManager.h | 5 +---- src/ModuleManager.cpp | 13 ++----------- src/ModuleManager.h | 6 +++--- src/PluginManager.cpp | 15 +++++---------- src/PluginManager.h | 11 +++++++---- 9 files changed, 18 insertions(+), 44 deletions(-) diff --git a/include/audacity/ModuleInterface.h b/include/audacity/ModuleInterface.h index cce83fd16..f89d8c26c 100644 --- a/include/audacity/ModuleInterface.h +++ b/include/audacity/ModuleInterface.h @@ -109,7 +109,6 @@ public: class ModuleManagerInterface /* not final */ { public: - virtual ~ModuleManagerInterface() {}; // Modules call this to register their interface virtual void RegisterModule(ModuleInterface *module) = 0; diff --git a/include/audacity/PluginInterface.h b/include/audacity/PluginInterface.h index b55a80ad6..9d6e6d1b2 100644 --- a/include/audacity/PluginInterface.h +++ b/include/audacity/PluginInterface.h @@ -54,7 +54,6 @@ class ModuleInterface; class PluginManagerInterface /* not final */ { public: - virtual ~PluginManagerInterface() {}; virtual bool IsPluginRegistered(const wxString & path) = 0; diff --git a/src/AudacityApp.cpp b/src/AudacityApp.cpp index 4c2810788..3c0f2f878 100644 --- a/src/AudacityApp.cpp +++ b/src/AudacityApp.cpp @@ -1984,10 +1984,6 @@ int AudacityApp::OnExit() // Terminate the PluginManager (must be done before deleting the locale) PluginManager::Get().Terminate(); - // Done with plugins and modules - PluginManager::Destroy(); - ModuleManager::Destroy(); - if (mLocale) delete mLocale; diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index 75c30e5cf..7fa5d6d6b 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -47,12 +47,6 @@ DeviceManager* DeviceManager::Instance() return &dm; } -/// Releases memory assosiated with the singleton -void DeviceManager::Destroy() -{ - -} - const std::vector &DeviceManager::GetInputDeviceMaps() { if (!m_inited) diff --git a/src/DeviceManager.h b/src/DeviceManager.h index eb029c45c..3cea23f99 100644 --- a/src/DeviceManager.h +++ b/src/DeviceManager.h @@ -51,9 +51,6 @@ class DeviceManager final /// Gets the singleton instance static DeviceManager* Instance(); - /// Releases memory assosiated with the singleton - static void Destroy(); - /// Gets a NEW list of devices by terminating and restarting portaudio /// Assumes that DeviceManager is only used on the main thread. void Rescan(); @@ -74,7 +71,7 @@ class DeviceManager final protected: //private constructor - Singleton. DeviceManager(); - virtual ~DeviceManager(); + ~DeviceManager(); /// Does an initial scan. /// Called by GetInputDeviceMaps and GetOutputDeviceMaps when needed. void Init(); diff --git a/src/ModuleManager.cpp b/src/ModuleManager.cpp index 8bfbdefb0..51b2e3b3c 100755 --- a/src/ModuleManager.cpp +++ b/src/ModuleManager.cpp @@ -180,7 +180,7 @@ void * Module::GetSymbol(const wxString &name) // ============================================================================ // The one and only ModuleManager -ModuleManager *ModuleManager::mInstance = NULL; +std::unique_ptr ModuleManager::mInstance{}; // Provide builtin modules a means to identify themselves static wxArrayPtrVoid *pBuiltinModuleList = NULL; @@ -358,21 +358,12 @@ ModuleManager & ModuleManager::Get() { if (!mInstance) { - mInstance = new ModuleManager(); + mInstance.reset(safenew ModuleManager); } return *mInstance; } -void ModuleManager::Destroy() -{ - if (mInstance) - { - delete mInstance; - mInstance = NULL; - } -} - bool ModuleManager::DiscoverProviders() { InitializeBuiltins(); diff --git a/src/ModuleManager.h b/src/ModuleManager.h index 09302c2f3..429e67372 100644 --- a/src/ModuleManager.h +++ b/src/ModuleManager.h @@ -88,7 +88,6 @@ public: // ------------------------------------------------------------------------- static ModuleManager & Get(); - static void Destroy(); void Initialize(CommandHandler & cmdHandler); int Dispatch(ModuleDispatchTypes type); @@ -110,14 +109,15 @@ public: private: // I'm a singleton class ModuleManager(); - virtual ~ModuleManager(); + ~ModuleManager(); void InitializeBuiltins(); ModuleInterface *LoadModule(const wxString & path); private: friend ModuleInterfaceDeleter; - static ModuleManager *mInstance; + friend std::default_delete; + static std::unique_ptr mInstance; ModuleMainMap mModuleMains; ModuleMap mDynModules; diff --git a/src/PluginManager.cpp b/src/PluginManager.cpp index 71aa260e9..caee4f6ca 100644 --- a/src/PluginManager.cpp +++ b/src/PluginManager.cpp @@ -1666,7 +1666,7 @@ bool PluginManager::RemovePrivateConfig(const PluginID & ID, const wxString & gr // ============================================================================ // The one and only PluginManager -PluginManager *PluginManager::mInstance = NULL; +std::unique_ptr PluginManager::mInstance{}; // ---------------------------------------------------------------------------- // Creation/Destruction @@ -1679,6 +1679,9 @@ PluginManager::PluginManager() PluginManager::~PluginManager() { + // Ensure termination (harmless if already done) + Terminate(); + if (mSettings) { delete mSettings; @@ -1700,20 +1703,12 @@ PluginManager & PluginManager::Get() { if (!mInstance) { - mInstance = new PluginManager(); + mInstance.reset(safenew PluginManager); } return *mInstance; } -void PluginManager::Destroy() -{ - if (mInstance) - { - delete mInstance; - } -} - void PluginManager::Initialize() { // Always load the registry first diff --git a/src/PluginManager.h b/src/PluginManager.h index 5db8e911c..310406b8b 100644 --- a/src/PluginManager.h +++ b/src/PluginManager.h @@ -16,6 +16,7 @@ #include #include +#include "MemoryX.h" #include #include "audacity/EffectInterface.h" @@ -172,8 +173,6 @@ class PluginRegistrationDialog; class PluginManager final : public PluginManagerInterface { public: - PluginManager(); - virtual ~PluginManager(); // PluginManagerInterface implementation @@ -234,7 +233,6 @@ public: void Terminate(); static PluginManager & Get(); - static void Destroy(); static PluginID GetID(ModuleInterface *module); static PluginID GetID(EffectIdentInterface *effect); @@ -270,6 +268,10 @@ public: void UnregisterPlugin(const PluginID & ID); private: + // private! Use Get() + PluginManager(); + ~PluginManager(); + void Load(); void LoadGroup(PluginType type); void Save(); @@ -309,7 +311,8 @@ private: int b64decode(const wxString &in, void *out); private: - static PluginManager *mInstance; + friend std::default_delete; + static std::unique_ptr mInstance; bool IsDirty(); void SetDirty(bool dirty = true);