Commit in slic on MAIN
include/LogManager.hh+1741.12 -> 1.13
       /LogStream.hh+15-141.3 -> 1.4
       /Module.hh+95-901.8 -> 1.9
src/LogMessenger.cc+7-51.10 -> 1.11
   /Module.cc+29-231.5 -> 1.6
+320-132
5 modified files
JM: refactoring and bug fixing of log messaging classes

slic/include
LogManager.hh 1.12 -> 1.13
diff -N LogManager.hh
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ LogManager.hh	9 Apr 2008 22:09:35 -0000	1.13
@@ -0,0 +1,174 @@
+#ifndef SLIC_LOGMANAGER_HH
+#define SLIC_LOGMANAGER_HH 1
+
+// slic
+#include "LogStream.hh"
+#include "LogMessenger.hh"
+#include "Singleton.hh"
+
+// stl
+#include <algorithm>
+#include <vector>
+#include <map>
+
+namespace slic
+{
+    /**
+     * Manages LogStreams and their associated LogMessenger objects.
+     * This class "owns" both LogStream and LogMessenger objects, so
+     * neither of these classes should be deleted outside of this class.
+     *
+     * LogManager and LogStream are both friends of each other.
+     */
+    class LogManager : public Singleton<LogManager>
+    {
+
+        private:
+
+            // LogStream vector.
+            typedef std::vector<LogStream*> LogList;
+
+            // LogStream vector iterator.
+            typedef LogList::iterator LogListIterator;
+            
+            // LogMessenger vector.
+            typedef std::vector<LogMessenger*> LogMessengerList;
+
+            // LogMessenger vector iterator.
+            typedef LogMessengerList::iterator LogMessengerListIterator;
+
+            // Name to LogStream map.
+            typedef std::map<std::string, LogStream*> LogNameMap;
+
+            // LogMessenger to LogStream map.
+            typedef std::map<LogStream*, LogMessenger*> LogMessengerMap;
+
+        public:
+
+            LogManager()
+            {;}
+
+            ~LogManager()
+            {;}
+
+        public:
+
+            /**
+             * Create a LogStream.
+             */
+            LogStream* createLog( std::string name = "NONE",
+                                  LOG::ELevel level = LOG::okay,
+                                  ostream* os = &std::cout)
+            {
+                LogStream *l = new LogStream( name, level, os );
+                m_logs.push_back( l );                
+                m_logNameMap[ name ] = l;
+                return l;
+            }
+
+            /**
+             * Create a LogMessenger attached to the given LogStream.
+             */
+            LogMessenger* createLogMessenger( LogStream *l )
+            {
+                // Check for and return an existing LogMessenger.
+                LogMessenger *check = findLogMessenger( l );
+                if ( check != 0 )
+                {
+                    return check;
+                }
+
+                // Make a new LogMessenger.
+                LogMessenger *lm = new LogMessenger( l );
+                m_messengers.push_back( lm );
+                m_logMessengerMap[ l ] = lm;
+                return lm;
+            }
+
+            /**
+             * Remove a LogStream and also its LogMessenger, if it exists.
+             */
+            void removeLog( LogStream *log )
+            {
+                if ( log == 0 ) return;
+                LogListIterator it = findLog( log );
+                if ( it != m_logs.end() ) 
+                {
+                    LogStream *l = (*it);
+
+                    // Delete the LogStream's messenger, if it exists.
+                    LogMessenger *lm = findLogMessenger( l );
+                    if ( lm != 0 )
+                    {
+                        removeLogMessenger( lm );
+                    }
+
+                    // Delete the LogStream object.
+                    delete (*it);
+
+                    // Remove the LogStream entry.
+                    m_logs.erase( it );
+                }
+            }        
+
+        private:
+
+            /**
+             * Remove a LogMessenger.
+             */
+            void removeLogMessenger( LogMessenger *lm )
+            {
+                if ( lm == 0 ) return;
+                LogMessengerListIterator it = findLogMessenger( lm );
+                if ( it != m_messengers.end() ) 
+                {
+                    m_messengers.erase( it );
+                }                
+            }
+
+            /**
+             * Find a LogStream pointer by name.
+             */
+            LogStream* findLog( const std::string &name )
+            {
+                return m_logNameMap[ name ];
+            }
+
+            /**
+             * Get position of LogStream by its pointer.
+             */
+            LogListIterator findLog( LogStream *log )
+            {
+                if ( log == 0 ) return m_logs.end();
+                return find( m_logs.begin(), m_logs.end(), log );
+            }
+
+            /**
+             * Find position of LogMessenger by its pointer.
+             */
+            LogMessengerListIterator findLogMessenger( LogMessenger *lm )
+            {
+                if ( lm == 0 ) return m_messengers.end();
+                return find( m_messengers.begin(), m_messengers.end(), lm );
+            }
+
+            /**
+             * Find a LogMessenger by its associated LogStream.
+             */
+            LogMessenger* findLogMessenger( LogStream *s )
+            {
+                return m_logMessengerMap[ s ];
+            }
+            
+            friend class LogStream;
+
+        private:
+            LogList m_logs;
+            LogMessengerList m_messengers;
+            LogNameMap m_logNameMap;
+            LogMessengerMap m_logMessengerMap;
+    };
+}
+
+
+#endif

slic/include
LogStream.hh 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- LogStream.hh	8 Apr 2008 22:06:12 -0000	1.3
+++ LogStream.hh	9 Apr 2008 22:09:35 -0000	1.4
@@ -62,9 +62,9 @@
     class LogStream
     {
 
-        public:
+        protected:
 
-            LogStream( const std::string& name,
+            LogStream( std::string name,
                        LOG::ELevel level,
                        ostream* os = &std::cout )
                 : m_name( name ), 
@@ -85,13 +85,17 @@
                   m_active( true ),
                   m_fos( 0 ),
                   m_messenger( 0 )
-            {;}
+            {
+                m_messenger = new LogMessenger( this );
+            }
 
             virtual ~LogStream()
-            {
-                // FIXME: !!! Deletion of messenger causes seg fault !!!
-                //delete m_messenger;
-            } 
+            {} 
+
+            // Give LogManager full access to protected constructors.
+            friend class LogManager;
+
+        public:            
 
             const std::string& getName() const
             {
@@ -123,17 +127,14 @@
              */
             LogStream& operator << ( const LOG::ELevel& x )
             {
+                // Subsequent messages will be placed onto the LogStream
+                // if the argument is less than or equal to the current
+                // output level.
                 if ( x <= getOutputLevel() ) {
-
                     // Set active state.
                     m_active = true;
-
-                    // Set the current output level.
-                    m_outputLevel = x;	
-
                 }
                 else {       	
-
                     // Set inactive state.  
                     m_active = false;
                 }
@@ -145,7 +146,6 @@
                 if ( isActive() ) {
                     if ( x == LOG::done ) {
                         getOutputStream() << std::endl;
-                        m_outputLevel = m_defaultOutputLevel;
                     }
                     else if ( x == LOG::head ) { 
                         getOutputStream() <<
@@ -420,6 +420,7 @@
             bool m_active;
             std::ofstream* m_fos;
             LogMessenger* m_messenger;
+
     };
 }
 

slic/include
Module.hh 1.8 -> 1.9
diff -u -r1.8 -r1.9
--- Module.hh	27 Apr 2007 01:54:32 -0000	1.8
+++ Module.hh	9 Apr 2008 22:09:35 -0000	1.9
@@ -1,10 +1,10 @@
-// $Header: /cvs/lcd/slic/include/Module.hh,v 1.8 2007/04/27 01:54:32 jeremy Exp $
+// $Header: /cvs/lcd/slic/include/Module.hh,v 1.9 2008/04/09 22:09:35 jeremy Exp $
 
 #ifndef SLIC_MODULE_HH
 #define SLIC_MODULE_HH 1
 
 // slic
-#include "LogStream.hh"
+#include "LogManager.hh"
 
 // std
 #include <string>
@@ -19,99 +19,104 @@
 
 namespace slic
 {
-  /**
-   * @class Module
-   * @brief Base class for slic modules, providing a few common functions.
-   */
-  class Module 
-  {
-  public:
-    enum ModuleStatus {
-      eOkay = 0,
-      eNotInitialized = 1,
-      eBadState = 2,
-      eFatalError = 3
-    };
-
-  protected:
-
-    /** 
-     * Only concrete Module subclasses can access the ctor. 
+    /**
+     * @class Module
+     * @brief Base class for slic code modules that provides common functionality,
+     *        such as logging to an output stream.
      */
-    Module(const std::string& name, bool deleteOnExit=true, bool autoRegister=true);
-
-  public:
-    virtual ~Module();
-
-  public:
-
-    const std::string& getName() const {
-      return m_name;
-    }
-
-    const ModuleStatus getStatus() const {
-      return m_status;
-    }
-
-    virtual void initialize() 
-    {;}
-
-    virtual void reset() 
-    {;}
-
-    virtual void cleanup() 
-    {;}
-
-    bool deleteOnExit()
+    class Module 
     {
-      return m_deleteOnExit;
-    }
-
-    LogStream& log()
-    {
-      return m_log;
-    }
-
-    virtual void beginEvent( const G4Event* )
-    {;}
-
-    virtual void endEvent( const G4Event* )
-    {;}
-
-    virtual void beginRun( const G4Run* )
-    {;}
-
-    virtual void endRun( const G4Run* )
-    {;}
-
-    virtual void preTracking( const G4Track* )
-    {;}
-
-    virtual void postTracking( const G4Track* )
-    {;}    
-
-    virtual void stepping( const G4Step* ) 
-    {;}
-
-    G4ClassificationOfNewTrack stackingClassifyNewTrack( const G4Track* )
-    {
-      G4Exception("This method should never be called.  Please override it.");
-      // Arbitrary return value.  Will never reach here.
-      return fWaiting;
-    }
+        public:
+            enum ModuleStatus {
+                eOkay = 0,
+                eNotInitialized = 1,
+                eBadState = 2,
+                eFatalError = 3
+            };
+
+        protected:
+
+            /** 
+             * Only concrete Module subclasses can access the constructor. 
+             */
+            Module( const std::string& name, 
+                    bool deleteOnExit = true, 
+                    bool autoRegister = true);
+
+        public:
+            virtual ~Module();
+
+        public:
+
+            const std::string& getName() const 
+            {
+                return m_name;
+            }
+
+            const ModuleStatus getStatus() const 
+            {
+                return m_status;
+            }
+
+            virtual void initialize() 
+            {;}
+
+            virtual void reset() 
+            {;}
+
+            virtual void cleanup() 
+            {;}
+
+            bool deleteOnExit()
+            {
+                return m_deleteOnExit;
+            }
+
+            LogStream& log()
+            {
+                return *m_log;
+            }
+
+            virtual void beginEvent( const G4Event* )
+            {;}
+
+            virtual void endEvent( const G4Event* )
+            {;}
+
+            virtual void beginRun( const G4Run* )
+            {;}
+
+            virtual void endRun( const G4Run* )
+            {;}
+
+            virtual void preTracking( const G4Track* )
+            {;}
+
+            virtual void postTracking( const G4Track* )
+            {;}    
+
+            virtual void stepping( const G4Step* ) 
+            {;}
+
+            G4ClassificationOfNewTrack stackingClassifyNewTrack( const G4Track* )
+            {
+                G4Exception("This method should never be called.  Please override it.");
+                // Arbitrary return value.  Will never reach here.
+                return fWaiting;
+            }
     
-    void stackingNewStage()
-    {;}
+            void stackingNewStage()
+            {;}
 
-    void stackingPrepareNewEvent()
-    {;}
+            void stackingPrepareNewEvent()
+            {;}
 
-  public:
-    ModuleStatus m_status;
-    std::string m_name;
-    LogStream m_log;
-    bool m_deleteOnExit;
-  };
+        public:
+            ModuleStatus m_status;
+            std::string m_name;
+            LogStream* m_log;          
+            bool m_deleteOnExit;
+    };
 }
 
 #endif

slic/src
LogMessenger.cc 1.10 -> 1.11
diff -u -r1.10 -r1.11
--- LogMessenger.cc	27 Apr 2007 01:54:35 -0000	1.10
+++ LogMessenger.cc	9 Apr 2008 22:09:36 -0000	1.11
@@ -1,9 +1,10 @@
-// $Id: LogMessenger.cc,v 1.10 2007/04/27 01:54:35 jeremy Exp $
+// $Id: LogMessenger.cc,v 1.11 2008/04/09 22:09:36 jeremy Exp $
 
 #include "LogMessenger.hh"
 
 // slic
 #include "LogStream.hh"
+#include "StringUtil.hh"
 
 // geant4
 #include "G4UIcmdWithAnInteger.hh"
@@ -33,15 +34,16 @@
   
   void LogMessenger::defineCommands()
   {
-    m_loggerDir = new G4UIdirectory( std::string( "/module/" + m_logStream->getName() + "/" ).c_str() );
+    m_loggerDir = new G4UIdirectory( std::string( "/log/" + m_logStream->getName() + "/" ).c_str() );
     m_loggerDir->SetGuidance( std::string( "Commands for the logger " + m_logStream->getName() ).c_str() );
     
-    m_setLevelCmd = new G4UIcmdWithAnInteger( std::string("/module/" + m_logStream->getName() + "/setLogLevel" ).c_str(), this );
+    m_setLevelCmd = new G4UIcmdWithAnInteger( std::string("/log/" + m_logStream->getName() + "/setLogLevel" ).c_str(), this );
     m_setLevelCmd->SetParameterName( "logLevel", false );
-    m_setLevelCmd->SetRange("logLevel > -1 && logLevel < 7");
+    std::string range = "logLevel >= 0 && logLevel < " + StringUtil::toString( LOG::nlevels );
+    m_setLevelCmd->SetRange( range.c_str() );
     m_setLevelCmd->SetGuidance("Set the log level.");
 
-    m_fileCmd = new G4UIcmdWithAString( std::string("/module/" + m_logStream->getName() + "/setLogFile" ).c_str(), this );
+    m_fileCmd = new G4UIcmdWithAString( std::string("/log/" + m_logStream->getName() + "/setLogFile" ).c_str(), this );
     m_fileCmd->SetParameterName( "file", false );
     m_fileCmd->SetGuidance("Set the output file for this logger.");
   }

slic/src
Module.cc 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- Module.cc	27 Apr 2007 01:54:35 -0000	1.5
+++ Module.cc	9 Apr 2008 22:09:36 -0000	1.6
@@ -1,4 +1,4 @@
-// $Header: /cvs/lcd/slic/src/Module.cc,v 1.5 2007/04/27 01:54:35 jeremy Exp $
+// $Header: /cvs/lcd/slic/src/Module.cc,v 1.6 2008/04/09 22:09:36 jeremy Exp $
 #include "Module.hh"
 
 // lcdd
@@ -9,30 +9,36 @@
 
 namespace slic
 {
-  Module::Module( const std::string& name, bool deleteOnExit, bool autoRegister )
-    : m_deleteOnExit( deleteOnExit )
-  {
-    m_name = name;
-
-    // Register this module with the ModuleRegistry.
-    if ( autoRegister ) {
-      ModuleRegistry::instance()->registerModule( this );
-    }
-
-    // Create a logger for this module.
-    m_log = LogStream( m_name, LOG::okay );
-
-    // Print initialization message to the log.
+    Module::Module( const std::string& name, 
+                    bool deleteOnExit, 
+                    bool autoRegister )
+        : m_deleteOnExit( deleteOnExit )
+    {
+        m_name = name;
+        
+        // If requested, register the module with the ModuleRegistry.
+        if ( autoRegister ) {
+            ModuleRegistry::instance()->registerModule( this );
+        }
+        
+        // Create a logger for this module.
+        m_log = LogManager::instance()->createLog( m_name, LOG::okay );
+
+        // Create a Geant4 messenger for the logger.
+        LogManager::instance()->createLogMessenger( m_log );        
+               
+        // Init message.
 #ifdef SLIC_LOG
-    log().verbose( "Initialized module <" + getName() + ">" );
+        log().verbose( "Initialized module <" + getName() + ">" );
 #endif    
-  }
-
-  Module::~Module()
-  {
+    }
+    
+    Module::~Module()
+    {
 #ifdef SLIC_LOG
-    log().verbose( getName() + " is being deleted." );
+        log().verbose( getName() + " is being deleted." );
 #endif
-    ModuleRegistry::instance()->deregisterModule( this );
-  }
+        LogManager::instance()->removeLog( m_log );
+        ModuleRegistry::instance()->deregisterModule( this );
+    }
 }
CVSspam 0.2.8