Fix a bunch of memory leaks reported by valgrind and msvc about the registered factories never being cleared.

Originally committed to SVN as r2951.
This commit is contained in:
harukalover 2009-05-18 05:42:54 +00:00
parent 55f4a80904
commit 14e3cb4323
13 changed files with 132 additions and 17 deletions

View file

@ -181,6 +181,13 @@ void AudioPlayerFactoryManager::RegisterProviders() {
}
///////////////////////
// Clear all factories
void AudioPlayerFactoryManager::ClearProviders() {
ClearFactories();
}
//////////
// Static
template <class AudioPlayerFactory> std::map<wxString,AudioPlayerFactory*>* FactoryManager<AudioPlayerFactory>::factories=NULL;

View file

@ -59,6 +59,7 @@ class AudioPlayerFactoryManager : public FactoryManager<AudioPlayerFactory> {
public:
static AudioPlayer *GetAudioPlayer();
static void RegisterProviders();
static void ClearProviders();
};

View file

@ -288,6 +288,13 @@ void AudioProviderFactoryManager::RegisterProviders() {
}
///////////////////////
// Clear all providers
void AudioProviderFactoryManager::ClearProviders() {
ClearFactories();
}
//////////
// Static
template <class AudioProviderFactory> std::map<wxString,AudioProviderFactory*>* FactoryManager<AudioProviderFactory>::factories=NULL;

View file

@ -51,4 +51,5 @@ class AudioProviderFactoryManager : public FactoryManager<AudioProviderFactory>
public:
static void RegisterProviders();
static AudioProvider *GetAudioProvider(wxString filename, int cache=-1);
static void ClearProviders();
};

View file

@ -52,6 +52,17 @@ protected:
// Static map of all factories
static std::map<wxString,T*> *factories;
static void ClearFactories() {
if (factories && !factories->empty()) {
typename std::map<wxString,T*>::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("")) {

View file

@ -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
}

View file

@ -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();

View file

@ -80,6 +80,13 @@ void SpellCheckerFactoryManager::RegisterProviders() {
}
///////////////////////
// Clear all providers
void SpellCheckerFactoryManager::ClearProviders() {
ClearFactories();
}
//////////
// Static
template <class SpellCheckerFactory> std::map<wxString,SpellCheckerFactory*>* FactoryManager<SpellCheckerFactory>::factories=NULL;

View file

@ -50,4 +50,5 @@ class SpellCheckerFactoryManager : public FactoryManager<SpellCheckerFactory> {
public:
static SpellChecker *GetSpellChecker();
static void RegisterProviders();
static void ClearProviders();
};

View file

@ -107,6 +107,13 @@ void SubtitlesProviderFactoryManager::RegisterProviders() {
}
///////////////////
// Clear providers
void SubtitlesProviderFactoryManager::ClearProviders() {
ClearFactories();
}
//////////
// Static
template <class SubtitlesProviderFactory> std::map<wxString,SubtitlesProviderFactory*>* FactoryManager<SubtitlesProviderFactory>::factories=NULL;

View file

@ -51,6 +51,7 @@ class SubtitlesProviderFactoryManager : public FactoryManager<SubtitlesProviderF
public:
static SubtitlesProvider *GetProvider();
static void RegisterProviders();
static void ClearProviders();
static bool ProviderAvailable();
};

View file

@ -114,6 +114,13 @@ void VideoProviderFactoryManager::RegisterProviders() {
}
///////////////////////
// Clear all providers
void VideoProviderFactoryManager::ClearProviders() {
ClearFactories();
}
//////////
// Static
template <class VideoProviderFactory> std::map<wxString,VideoProviderFactory*>* FactoryManager<VideoProviderFactory>::factories=NULL;

View file

@ -51,4 +51,5 @@ class VideoProviderFactoryManager : public FactoryManager<VideoProviderFactory>
public:
static void RegisterProviders();
static VideoProvider *GetProvider(wxString video,double fps=0.0);
static void ClearProviders();
};