From 86104e0bf0b76c06160eb299989262d0e9619c1c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 27 May 2007 11:40:03 +0000 Subject: Reverted r26922. svn-id: r26967 --- base/plugins.cpp | 2 ++ common/config-manager.cpp | 2 ++ common/singleton.h | 13 ++++++++++--- graphics/cursorman.cpp | 2 ++ graphics/fontman.cpp | 2 ++ graphics/imageman.cpp | 2 ++ gui/newgui.cpp | 2 ++ sound/audiocd.cpp | 2 ++ 8 files changed, 24 insertions(+), 3 deletions(-) diff --git a/base/plugins.cpp b/base/plugins.cpp index 7e614dd2bd..23889242f2 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -139,6 +139,8 @@ public: #pragma mark - +DECLARE_SINGLETON(PluginManager); + PluginManager::PluginManager() { #ifndef DYNAMIC_MODULES // Add the static plugin provider if we do not build with dynamic diff --git a/common/config-manager.cpp b/common/config-manager.cpp index 41f3c1a7e9..f8426f18d0 100644 --- a/common/config-manager.cpp +++ b/common/config-manager.cpp @@ -33,6 +33,8 @@ #include "common/file.h" #include "common/util.h" +DECLARE_SINGLETON(Common::ConfigManager); + #ifdef __PLAYSTATION2__ #include "backends/platform/ps2/systemps2.h" #endif diff --git a/common/singleton.h b/common/singleton.h index f26324999e..5e72e72230 100644 --- a/common/singleton.h +++ b/common/singleton.h @@ -37,6 +37,8 @@ private: Singleton(const Singleton&); Singleton& operator= (const Singleton&); + static T* _singleton; + /** * The default object factory used by the template class Singleton. * By specialising this template function, one can make a singleton use a @@ -56,13 +58,16 @@ public: public: static T& instance() { - // TODO: We aren't thread safe. + // TODO: We aren't thread safe. For now we ignore it since the + // only thing using this singleton template is the config manager, + // and that is first instantiated long before any threads. // TODO: We don't leak, but the destruction order is nevertheless // semi-random. If we use multiple singletons, the destruction // order might become an issue. There are various approaches // to solve that problem, but for now this is sufficient - static T *instance = T::makeInstance(); - return *instance; + if (!_singleton) + _singleton = T::makeInstance(); + return *_singleton; } protected: Singleton() { } @@ -75,6 +80,8 @@ protected: typedef T SingletonBaseType; }; +#define DECLARE_SINGLETON(T) template<> T* Common::Singleton::_singleton=0 + } // End of namespace Common #endif diff --git a/graphics/cursorman.cpp b/graphics/cursorman.cpp index 397d74789f..06364b860a 100644 --- a/graphics/cursorman.cpp +++ b/graphics/cursorman.cpp @@ -24,6 +24,8 @@ #include "common/system.h" #include "common/stack.h" +DECLARE_SINGLETON(Graphics::CursorManager); + namespace Graphics { static bool g_initialized = false; diff --git a/graphics/fontman.cpp b/graphics/fontman.cpp index fad8654d02..9b567c0be8 100644 --- a/graphics/fontman.cpp +++ b/graphics/fontman.cpp @@ -22,6 +22,8 @@ #include "graphics/fontman.h" //#include "gui/consolefont.h" +DECLARE_SINGLETON(Graphics::FontManager); + namespace Graphics { #if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__)) diff --git a/graphics/imageman.cpp b/graphics/imageman.cpp index 1145dd262f..d4fc9da72d 100644 --- a/graphics/imageman.cpp +++ b/graphics/imageman.cpp @@ -23,6 +23,8 @@ #include "graphics/imageman.h" #include "graphics/surface.h" +DECLARE_SINGLETON(Graphics::ImageManager); + namespace Graphics { ImageManager::ImageManager() : _surfaces() #ifdef USE_ZLIB diff --git a/gui/newgui.cpp b/gui/newgui.cpp index bd7315add5..948c7fa56f 100644 --- a/gui/newgui.cpp +++ b/gui/newgui.cpp @@ -32,6 +32,8 @@ #include "common/config-manager.h" +DECLARE_SINGLETON(GUI::NewGui); + namespace GUI { /* diff --git a/sound/audiocd.cpp b/sound/audiocd.cpp index 2635c2a0a6..7e1fb2400f 100644 --- a/sound/audiocd.cpp +++ b/sound/audiocd.cpp @@ -32,6 +32,8 @@ #include "common/util.h" #include "common/system.h" +DECLARE_SINGLETON(Audio::AudioCDManager); + namespace Audio { AudioCDManager::AudioCDManager() { -- cgit v1.2.3