From 392fbdfa4dbefd451f5794c141664315b8a12b2e Mon Sep 17 00:00:00 2001 From: harukalover Date: Mon, 18 May 2009 05:42:54 +0000 Subject: [PATCH] Fix a bunch of memory leaks reported by valgrind and msvc about the registered factories never being cleared. Originally committed to SVN as r2951. --- aegisub/src/audio_player.cpp | 7 +++ aegisub/src/audio_player_manager.h | 1 + aegisub/src/audio_provider.cpp | 7 +++ aegisub/src/audio_provider_manager.h | 1 + aegisub/src/factory_manager.h | 15 +++++- aegisub/src/plugin_manager.cpp | 68 ++++++++++++++++++------ aegisub/src/plugin_manager.h | 26 +++++++++ aegisub/src/spellchecker.cpp | 7 +++ aegisub/src/spellchecker_manager.h | 1 + aegisub/src/subtitles_provider.cpp | 7 +++ aegisub/src/subtitles_provider_manager.h | 1 + aegisub/src/video_provider_manager.cpp | 7 +++ aegisub/src/video_provider_manager.h | 1 + 13 files changed, 132 insertions(+), 17 deletions(-) diff --git a/aegisub/src/audio_player.cpp b/aegisub/src/audio_player.cpp index c3c1532b5..bb84aa747 100644 --- a/aegisub/src/audio_player.cpp +++ b/aegisub/src/audio_player.cpp @@ -181,6 +181,13 @@ void AudioPlayerFactoryManager::RegisterProviders() { } +/////////////////////// +// Clear all factories +void AudioPlayerFactoryManager::ClearProviders() { + ClearFactories(); +} + + ////////// // Static template std::map* FactoryManager::factories=NULL; diff --git a/aegisub/src/audio_player_manager.h b/aegisub/src/audio_player_manager.h index 1781a33d9..4113b6529 100644 --- a/aegisub/src/audio_player_manager.h +++ b/aegisub/src/audio_player_manager.h @@ -59,6 +59,7 @@ class AudioPlayerFactoryManager : public FactoryManager { public: static AudioPlayer *GetAudioPlayer(); static void RegisterProviders(); + static void ClearProviders(); }; diff --git a/aegisub/src/audio_provider.cpp b/aegisub/src/audio_provider.cpp index aadf4324e..940075555 100644 --- a/aegisub/src/audio_provider.cpp +++ b/aegisub/src/audio_provider.cpp @@ -288,6 +288,13 @@ void AudioProviderFactoryManager::RegisterProviders() { } +/////////////////////// +// Clear all providers +void AudioProviderFactoryManager::ClearProviders() { + ClearFactories(); +} + + ////////// // Static template std::map* FactoryManager::factories=NULL; diff --git a/aegisub/src/audio_provider_manager.h b/aegisub/src/audio_provider_manager.h index a5f93f7b3..e3eb041b7 100644 --- a/aegisub/src/audio_provider_manager.h +++ b/aegisub/src/audio_provider_manager.h @@ -51,4 +51,5 @@ class AudioProviderFactoryManager : public FactoryManager public: static void RegisterProviders(); static AudioProvider *GetAudioProvider(wxString filename, int cache=-1); + static void ClearProviders(); }; diff --git a/aegisub/src/factory_manager.h b/aegisub/src/factory_manager.h index 3a0fab148..79ff21b79 100644 --- a/aegisub/src/factory_manager.h +++ b/aegisub/src/factory_manager.h @@ -52,6 +52,17 @@ protected: // Static map of all factories static std::map *factories; + static void ClearFactories() { + if (factories && !factories->empty()) { + typename std::map::iterator iter; + for (iter = factories->begin(); iter != factories->end(); iter++) { + delete iter->second; + } + factories->clear(); + } + delete factories; + } + // Register one factory type (with possible subtypes) static void RegisterFactory(T* factory,wxString name, wxArrayString subTypes=wxArrayString()) { // Create factories if it doesn't exist @@ -91,7 +102,9 @@ protected: public: // Virtual destructor - virtual ~FactoryManager() {} + virtual ~FactoryManager() { + ClearFactories(); + }; // Get list of all factories, with favourite as first static wxArrayString GetFactoryList(wxString favourite=_T("")) { diff --git a/aegisub/src/plugin_manager.cpp b/aegisub/src/plugin_manager.cpp index 5f768d2ad..89bb15e61 100644 --- a/aegisub/src/plugin_manager.cpp +++ b/aegisub/src/plugin_manager.cpp @@ -44,30 +44,66 @@ #include "audio_player_manager.h" #include "subtitles_provider_manager.h" #include "spellchecker_manager.h" -#ifdef WITH_AUTO4_LUA -#include "auto4_lua_factory.h" -#endif -#ifdef WITH_PERL -#include "auto4_perl_factory.h" -#endif -#ifdef WITH_AUTO3 -#include "auto4_auto3_factory.h" -#endif -#ifdef WITH_RUBY -#include "auto4_ruby_factory.h" -#endif /////////////// // Constructor PluginManager::PluginManager() { init = false; + +#ifdef WITH_AUTO4_LUA + lua = NULL; +#endif +#ifdef WITH_PERL + perl = NULL; +#endif +#ifdef WITH_AUTO3 + auto3 = NULL; +#endif +#ifdef WITH_RUBY + ruby = NULL; +#endif + } ////////////// // Destructor PluginManager::~PluginManager() { + VideoProviderFactoryManager::ClearProviders(); + AudioProviderFactoryManager::ClearProviders(); + AudioPlayerFactoryManager::ClearProviders(); + SubtitlesProviderFactoryManager::ClearProviders(); + SpellCheckerFactoryManager::ClearProviders(); + +#ifdef WITH_AUTO4_LUA + if (lua) { + lua->Unregister(lua); + delete lua; + lua = NULL; + } +#endif +#ifdef WITH_PERL + if (perl) { + perl->Unregister(perl); + delete perl; + perl = NULL; + } +#endif +#ifdef WITH_AUTO3 + if (auto3) { + auto3->Unregister(auto3); + delete auto3; + auto3 = NULL; + } +#endif +#ifdef WITH_RUBY + if (ruby) { + ruby->Unregister(ruby); + delete ruby; + ruby = NULL; + } +#endif } @@ -84,18 +120,18 @@ void PluginManager::RegisterBuiltInPlugins() { // Automation languages #ifdef WITH_AUTO4_LUA - Automation4::LuaScriptFactory *lua = new Automation4::LuaScriptFactory(); + lua = new Automation4::LuaScriptFactory(); lua->RegisterFactory(); #endif #ifdef WITH_PERL - Automation4::PerlScriptFactory *perl = new Automation4::PerlScriptFactory(); + perl = new Automation4::PerlScriptFactory(); perl->RegisterFactory(); #endif #ifdef WITH_AUTO3 - new Automation4::Auto3ScriptFactory(); + auto3 = new Automation4::Auto3ScriptFactory(); #endif #ifdef WITH_RUBY - new Automation4::RubyScriptFactory(); + ruby = new Automation4::RubyScriptFactory(); #endif } diff --git a/aegisub/src/plugin_manager.h b/aegisub/src/plugin_manager.h index 74b994c87..d4e652d88 100644 --- a/aegisub/src/plugin_manager.h +++ b/aegisub/src/plugin_manager.h @@ -36,6 +36,19 @@ #pragma once +#ifdef WITH_AUTO4_LUA +#include "auto4_lua_factory.h" +#endif +#ifdef WITH_PERL +#include "auto4_perl_factory.h" +#endif +#ifdef WITH_AUTO3 +#include "auto4_auto3_factory.h" +#endif +#ifdef WITH_RUBY +#include "auto4_ruby_factory.h" +#endif + //////////////////////// // Plugin manager class @@ -43,6 +56,19 @@ class PluginManager { private: bool init; +#ifdef WITH_AUTO4_LUA + Automation4::LuaScriptFactory *lua; +#endif +#ifdef WITH_PERL + Automation4::PerlScriptFactory *perl; +#endif +#ifdef WITH_AUTO3 + Automation4::Auto3ScriptFactory *auto3; +#endif +#ifdef WITH_RUBY + Automation4::RubyScriptFactory *ruby; +#endif + public: PluginManager(); ~PluginManager(); diff --git a/aegisub/src/spellchecker.cpp b/aegisub/src/spellchecker.cpp index 9e1a59bc5..3b08af2d6 100644 --- a/aegisub/src/spellchecker.cpp +++ b/aegisub/src/spellchecker.cpp @@ -80,6 +80,13 @@ void SpellCheckerFactoryManager::RegisterProviders() { } +/////////////////////// +// Clear all providers +void SpellCheckerFactoryManager::ClearProviders() { + ClearFactories(); +} + + ////////// // Static template std::map* FactoryManager::factories=NULL; diff --git a/aegisub/src/spellchecker_manager.h b/aegisub/src/spellchecker_manager.h index b81d3e6de..4fc901612 100644 --- a/aegisub/src/spellchecker_manager.h +++ b/aegisub/src/spellchecker_manager.h @@ -50,4 +50,5 @@ class SpellCheckerFactoryManager : public FactoryManager { public: static SpellChecker *GetSpellChecker(); static void RegisterProviders(); + static void ClearProviders(); }; diff --git a/aegisub/src/subtitles_provider.cpp b/aegisub/src/subtitles_provider.cpp index a7f90295a..16a9f159b 100644 --- a/aegisub/src/subtitles_provider.cpp +++ b/aegisub/src/subtitles_provider.cpp @@ -107,6 +107,13 @@ void SubtitlesProviderFactoryManager::RegisterProviders() { } +/////////////////// +// Clear providers +void SubtitlesProviderFactoryManager::ClearProviders() { + ClearFactories(); +} + + ////////// // Static template std::map* FactoryManager::factories=NULL; diff --git a/aegisub/src/subtitles_provider_manager.h b/aegisub/src/subtitles_provider_manager.h index d5ae146e8..0b33aafd6 100644 --- a/aegisub/src/subtitles_provider_manager.h +++ b/aegisub/src/subtitles_provider_manager.h @@ -51,6 +51,7 @@ class SubtitlesProviderFactoryManager : public FactoryManager std::map* FactoryManager::factories=NULL; diff --git a/aegisub/src/video_provider_manager.h b/aegisub/src/video_provider_manager.h index fc54e5a26..d45c924e5 100644 --- a/aegisub/src/video_provider_manager.h +++ b/aegisub/src/video_provider_manager.h @@ -51,4 +51,5 @@ class VideoProviderFactoryManager : public FactoryManager public: static void RegisterProviders(); static VideoProvider *GetProvider(wxString video,double fps=0.0); + static void ClearProviders(); };