libmoost
|
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