From 328b2f34ba2bdb0f27b9ef173d7dec93b7369edf Mon Sep 17 00:00:00 2001 From: John Peterson Date: Tue, 3 Feb 2009 09:28:15 +0000 Subject: [PATCH] PluginManager: Disabled LoadLibrary() and FreeLibrary() between Stop and Start for the Pad and Wiimote plugins. It's still present for the video and sound plugins as I explained in the comment in PluginManager.cpp. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2084 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Core/Src/PluginManager.cpp | 47 +++++++++++++++++--------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/Source/Core/Core/Src/PluginManager.cpp b/Source/Core/Core/Src/PluginManager.cpp index 80f607ba40..b7cc630bdd 100644 --- a/Source/Core/Core/Src/PluginManager.cpp +++ b/Source/Core/Core/Src/PluginManager.cpp @@ -54,10 +54,19 @@ CPluginManager::CPluginManager() : FreeLibrary() Called from: In an attempt to avoid the crash that occurs when the use LoadLibrary() and FreeLibrary() often (every game a game is stopped and started) these functions will only be used when - 1. Dolphin is started - 2. A plugin is changed - 3. Dolphin is closed - it will not be used when we Start and Stop games. + 1. Dolphin is started + 2. A plugin is changed + 3. Dolphin is closed + it will not be used when we Start and Stop games. With these exceptions: + 1. Video plugin: If FreeLibrary() is not called between Stop and Start it will fail for + several games on the next Start, but not for all games. + 2. Sond plugin: If FreeLibrary() is not called between Stop and Start I got the "Tried to + "get pointer for unknown address ffffffff" message for all games I tried. + If it was not for the crash I always got earlier after several (perhaps as many as twenty) Stop and Start + I would be indifferent about how often FreeLibrary() i used, but since it seems like it can fail + infrequently, at least for nJoy, I'd rather use FreeLibrary() more sparingly. However, I could not + reproduce any crash now after several Stop and Start so maybe it has gone away or I was lucky. In any case + if it works I'd rather be without FreeLibrary() between Start and Stop. */ CPluginManager::~CPluginManager() { @@ -75,7 +84,6 @@ CPluginManager::~CPluginManager() m_pad[i] = NULL; } - for (int i = 0; i < MAXWIIMOTES; i++) if (m_wiimote[i]) delete m_wiimote[i]; @@ -143,13 +151,26 @@ void CPluginManager::ShutdownPlugins() } if (m_video) + { m_video->Shutdown(); + // This is needed for Stop and Start to work + delete m_video; + m_video = NULL; + } if (m_dsp) + { m_dsp->Shutdown(); + // This is needed for Stop and Start to work + delete m_dsp; + m_dsp = NULL; + } - - for (int i = 0; i < MAXPADS; i++) { + // Disabled FreeLibrary() for these plugins. See comment above PluginManager::~CPluginManager() + // for an explanation about the current LoadLibrary() and FreeLibrary() behavior. + /* + for (int i = 0; i < MAXPADS; i++) + { if (m_pad[i] && OkayToInitPlugin(i)) { Console::Print("Delete: %i\n", i); delete m_pad[i]; @@ -157,17 +178,11 @@ void CPluginManager::ShutdownPlugins() m_pad[i] = NULL; } - for (int i = 0; i < MAXWIIMOTES; i++) { + for (int i = 0; i < MAXWIIMOTES; i++) + { delete m_wiimote[i]; m_wiimote[i] = NULL; - } - - delete m_dsp; - m_dsp = NULL; - - delete m_video; - m_video = NULL; - + }*/ } // Supporting functions