libmoost
/home/mhx/git/github/libmoost/include/moost/logging/global_scoped_logger.h
Go to the documentation of this file.
00001 /* vim:set ts=3 sw=3 sts=3 et: */
00028 #ifndef MOOST_LOGGING_GLOBAL_SCOPED_LOGGER_H
00029 #define MOOST_LOGGING_GLOBAL_SCOPED_LOGGER_H
00030 
00031 #include <boost/thread/tss.hpp>
00032 #include "scoped_logger.hpp"
00033 
00034 namespace moost { namespace logging {
00035 
00036 typedef boost::thread_specific_ptr<scoped_logger> global_scoped_logger_t;
00037 typedef boost::shared_ptr<scoped_logger>          LoggerPtr;
00038 
00042 extern global_scoped_logger_t pgScopedLogging;
00043 
00082 class global_scoped_logger
00083 {
00084 public:
00085 
00086    global_scoped_logger(const std::string& name)
00087    : m_pScopedLogging(pgScopedLogging)
00088    { m_pScopedLogging.reset( new scoped_logger(name)); }
00089 
00090    template <typename TTimer>
00091    global_scoped_logger(const std::string& name, TTimer& start)
00092    : m_pScopedLogging(pgScopedLogging)
00093    { m_pScopedLogging.reset( new scoped_logger(name, start) ); }
00094 
00095    ~global_scoped_logger()
00096    { m_pScopedLogging.reset(); }
00097 
00098 private:
00099 
00100    global_scoped_logger_t& m_pScopedLogging;
00101 };
00102 
00103 // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
00104 
00109 struct noop_deleter { void operator()(void*) {} };
00110 
00115 inline LoggerPtr get_global_scoped_logger()
00116 {
00117    if ( pgScopedLogging.get() == 0 )
00118       throw std::runtime_error("Global scoped_logger was not set for this thread!");
00119 
00120    // transform the pointer from thread specific to shared_ptr, just make
00121    // sure shared_ptr does NOT deallocate the object (that's responsibility of
00122    // thread specific).
00123    LoggerPtr sharedPtr( pgScopedLogging.get(), noop_deleter() );
00124    return sharedPtr;
00125 }
00126 
00127 // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
00128 
00133 #define MLOG_SCOPED_GLOBAL_NAMED_DEFINE(name) \
00134    moost::logging::global_scoped_logger __global_scoped_logger(name)
00135 
00136 #define MLOG_SCOPED_GLOBAL_NAMED_TIME_DEFINE(name, time) \
00137    moost::logging::global_scoped_logger __global_scoped_logger(name, time)
00138 
00143 #define MLOG_SCOPED_GLOBAL_FUNC_DEFINE() \
00144    moost::logging::global_scoped_logger __global_scoped_logger( BOOST_CURRENT_FUNCTION )
00145 
00146 #define MLOG_SCOPED_GLOBAL_FUNC_TIME_DEFINE(time) \
00147    moost::logging::global_scoped_logger __global_scoped_logger( BOOST_CURRENT_FUNCTION, time )
00148 
00152 #define MLOG_SCOPED_GLOBAL_GET_LOGGER(logger) \
00153    moost::logging::LoggerPtr logger = moost::logging::get_global_scoped_logger()
00154 
00160 #define MLOG_SCOPED_GLOBAL_FM303_DEFINE(name) \
00161    moost::multi_timer::scoped_time st(fm303_multi_timer(), name); \
00162    MLOG_SCOPED_GLOBAL_NAMED_TIME_DEFINE(name, st)
00163 
00164 // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
00165 // Create a default global logger, which basically does nothing.
00166 constructor__(init_global_scoped_logger)
00167 {
00168    pgScopedLogging.reset(new scoped_logger);
00169 }
00170 
00171 }}
00172 
00173 #endif // MOOST_LOGGING_GLOBAL_SCOPED_LOGGER_H