[Orxonox-commit 4871] r9540 - in code/branches/testing: src/libraries/util/output test/util/output

landauf at orxonox.net landauf at orxonox.net
Sun Mar 10 11:29:44 CET 2013


Author: landauf
Date: 2013-03-10 11:29:44 +0100 (Sun, 10 Mar 2013)
New Revision: 9540

Modified:
   code/branches/testing/src/libraries/util/output/LogWriter.cc
   code/branches/testing/src/libraries/util/output/OutputDefinitions.h
   code/branches/testing/src/libraries/util/output/OutputManager.cc
   code/branches/testing/src/libraries/util/output/OutputManager.h
   code/branches/testing/test/util/output/ConsoleWriterTest.cc
Log:
some refactoring in OutputManager - for unittests it is sometimes necessary to create a new instance of OutputManager (or a mock), hence we should avoid storing dead references

Modified: code/branches/testing/src/libraries/util/output/LogWriter.cc
===================================================================
--- code/branches/testing/src/libraries/util/output/LogWriter.cc	2013-03-09 20:33:48 UTC (rev 9539)
+++ code/branches/testing/src/libraries/util/output/LogWriter.cc	2013-03-10 10:29:44 UTC (rev 9540)
@@ -117,7 +117,8 @@
         this->openFile();
 
         // request old output from MemoryWriter
-        OutputManager::getInstance().getMemoryWriter().resendOutput(this);
+        if (&OutputManager::getInstance().getMemoryWriter())
+            OutputManager::getInstance().getMemoryWriter().resendOutput(this);
     }
 
     /**

Modified: code/branches/testing/src/libraries/util/output/OutputDefinitions.h
===================================================================
--- code/branches/testing/src/libraries/util/output/OutputDefinitions.h	2013-03-09 20:33:48 UTC (rev 9539)
+++ code/branches/testing/src/libraries/util/output/OutputDefinitions.h	2013-03-10 10:29:44 UTC (rev 9540)
@@ -47,7 +47,7 @@
     context argument.
 */
 #define REGISTER_OUTPUT_CONTEXT(name) \
-    const OutputContextContainer& name() { static const OutputContextContainer& context = registerContext(#name); return context; }
+    const OutputContextContainer& name() { static OutputContextContainer context = registerContext(#name); return context; }
 
 /**
     @brief Defines a sub-context.

Modified: code/branches/testing/src/libraries/util/output/OutputManager.cc
===================================================================
--- code/branches/testing/src/libraries/util/output/OutputManager.cc	2013-03-09 20:33:48 UTC (rev 9539)
+++ code/branches/testing/src/libraries/util/output/OutputManager.cc	2013-03-10 10:29:44 UTC (rev 9540)
@@ -54,6 +54,11 @@
         this->combinedAdditionalContextsMask_ = context::none;
 
         this->subcontextCounter_ = 0;
+
+        this->isInitialized_ = false;
+        this->memoryWriterInstance_ = 0;
+        this->consoleWriterInstance_ = 0;
+        this->logWriterInstance_ = 0;
     }
 
     /**
@@ -61,6 +66,15 @@
     */
     OutputManager::~OutputManager()
     {
+        while (!this->listeners_.empty())
+            this->unregisterListener(this->listeners_[0]);
+
+        if (this->memoryWriterInstance_)
+            delete this->memoryWriterInstance_;
+        if (this->consoleWriterInstance_)
+            delete this->consoleWriterInstance_;
+        if (this->logWriterInstance_)
+            delete this->logWriterInstance_;
     }
 
     /*static*/ SharedPtr<OutputManager>& OutputManager::Testing::getInstancePointer()
@@ -87,46 +101,19 @@
     */
     /*static*/ OutputManager& OutputManager::getInstanceAndCreateListeners()
     {
-        static OutputManager& instance = OutputManager::getInstance();
+        OutputManager& instance = *OutputManager::Testing::getInstancePointer();
 
-        static MemoryWriter& memoryWriterInstance = OutputManager::getInstance().getMemoryWriter(); (void)memoryWriterInstance;
-        static ConsoleWriter& consoleWriterInstance = OutputManager::getInstance().getConsoleWriter(); (void)consoleWriterInstance;
-        static LogWriter& logWriterInstance = OutputManager::getInstance().getLogWriter(); (void)logWriterInstance;
+        if (!instance.isInitialized_) {
+            instance.isInitialized_ = true;
+            instance.memoryWriterInstance_ = new MemoryWriter();
+            instance.consoleWriterInstance_ = new ConsoleWriter(std::cout);
+            instance.logWriterInstance_ = new LogWriter();
+        }
 
         return instance;
     }
 
     /**
-     * @brief Returns the main instance of MemoryWriter which is managed by the OutputManager singleton.
-     * @note If OutputManager is ever un-singletonized, this instance must not remain static.
-     */
-    MemoryWriter& OutputManager::getMemoryWriter()
-    {
-        static MemoryWriter instance;
-        return instance;
-    }
-
-    /**
-     * @brief Returns the main instance of ConsoleWriter which is managed by the OutputManager singleton.
-     * @note If OutputManager is ever un-singletonized, this instance must not remain static.
-     */
-    ConsoleWriter& OutputManager::getConsoleWriter()
-    {
-        static ConsoleWriter instance(std::cout);
-        return instance;
-    }
-
-    /**
-     * @brief Returns the main instance of LogWriter which is managed by the OutputManager singleton.
-     * @note If OutputManager is ever un-singletonized, this instance must not remain static.
-     */
-    LogWriter& OutputManager::getLogWriter()
-    {
-        static LogWriter instance;
-        return instance;
-    }
-
-    /**
         @brief Sends an output message to all output listeners.
         @param level The level of the message
         @param context The context of the message

Modified: code/branches/testing/src/libraries/util/output/OutputManager.h
===================================================================
--- code/branches/testing/src/libraries/util/output/OutputManager.h	2013-03-09 20:33:48 UTC (rev 9539)
+++ code/branches/testing/src/libraries/util/output/OutputManager.h	2013-03-10 10:29:44 UTC (rev 9540)
@@ -71,11 +71,11 @@
             static OutputManager& getInstance();
             static OutputManager& getInstanceAndCreateListeners();
 
-            MemoryWriter& getMemoryWriter();
-            ConsoleWriter& getConsoleWriter();
-            LogWriter& getLogWriter();
+            inline MemoryWriter& getMemoryWriter()   { return *this->memoryWriterInstance_; }
+            inline ConsoleWriter& getConsoleWriter() { return *this->consoleWriterInstance_; }
+            inline LogWriter& getLogWriter()         { return *this->logWriterInstance_; }
 
-            void pushMessage(OutputLevel level, const OutputContextContainer& context, const std::string& message);
+            virtual void pushMessage(OutputLevel level, const OutputContextContainer& context, const std::string& message);
 
             virtual void registerListener(OutputListener* listener);
             virtual void unregisterListener(OutputListener* listener);
@@ -124,6 +124,11 @@
             std::map<std::string, OutputContextContainer> contextContainers_;   ///< Contains all contexts including sub-contexts and their containers
             OutputContextSubID subcontextCounter_;                              ///< Counts the number of sub-contexts (and generates their IDs)
 
+            bool isInitialized_;                                                ///< Becomes true once the following instances were created
+            MemoryWriter*  memoryWriterInstance_;                               ///< The main instance of MemoryWriter, managed by OutputManager
+            ConsoleWriter* consoleWriterInstance_;                              ///< The main instance of ConsoleWriter, managed by OutputManager
+            LogWriter*     logWriterInstance_;                                  ///< The main instance of LogWriter, managed by OutputManager
+
         public:
             struct _UtilExport Testing
             {

Modified: code/branches/testing/test/util/output/ConsoleWriterTest.cc
===================================================================
--- code/branches/testing/test/util/output/ConsoleWriterTest.cc	2013-03-09 20:33:48 UTC (rev 9539)
+++ code/branches/testing/test/util/output/ConsoleWriterTest.cc	2013-03-10 10:29:44 UTC (rev 9540)
@@ -64,6 +64,7 @@
 
     TEST(ConsoleWriterTest, DefaultConsoleWriterUsesCout)
     {
+        OutputManager::getInstanceAndCreateListeners();
         EXPECT_EQ(std::cout, OutputManager::getInstance().getConsoleWriter().getOutputStream());
     }
 }




More information about the Orxonox-commit mailing list