5 modified files
slic/include
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
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
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
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
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