00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef _SCOPED_LOG_H
00034 #define _SCOPED_LOG_H
00035
00036 #include <string>
00037 #include "params.h"
00038 #include "Log.h"
00039 #include "pip_includer.h"
00040 #include "ScopedLogReader.h"
00041
00073 class ScopedLog {
00074 public:
00085 ScopedLog(const std::string& _note, log_level_t _level, log_id_t _logId, bool _prefix, bool _suffix, bool _log, bool _annotate) :
00086 note(_note), level(_level), logId(_logId), prefix(_prefix), suffix(_suffix), doLog(_log), annotate(_annotate)
00087 {
00088 static const log_id_t lid = Log::getId("ScopedLogTimes");
00089 static const bool LOG_TIMES = params::get(params::MACE_LOG_SCOPED_TIMES,
00090 false);
00091 if(prefix) {
00092 if(suffix) {
00093 if(doLog) {
00094 Log::binaryLog(logId, ScopedLogReader_namespace::ScopedLogReader(true), level);
00095 if (LOG_TIMES) {
00096 Log::log(lid) << note << " STARTING" << Log::endl;
00097 }
00098 }
00099 if(annotate) {
00100 ANNOTATE_START_TASK(NULL, 0, note.c_str());
00101 int __pip_path_len__;
00102 const void* tp = ANNOTATE_GET_PATH_ID(&__pip_path_len__);
00103 ANNOTATE_PUSH_PATH_ID(NULL, 0, tp, __pip_path_len__);
00104 }
00105 }
00106 else {
00107 if(doLog) {
00108 Log::binaryLog(logId, ScopedLogReader_namespace::ScopedLogReader(true, false), level);
00109 }
00110 if(annotate) {
00111 ANNOTATE_NOTICE(NULL, 0, "%s", note.c_str());
00112 }
00113 }
00114 }
00115 }
00116
00117 virtual ~ScopedLog() {
00118 static const log_id_t lid = Log::getId("ScopedLogTimes");
00119 static const bool LOG_TIMES = params::get(params::MACE_LOG_SCOPED_TIMES,
00120 false);
00121 if(suffix) {
00122 if(prefix) {
00123 if(doLog) {
00124 Log::binaryLog(logId, ScopedLogReader_namespace::ScopedLogReader(false), level);
00125 if (LOG_TIMES) {
00126 Log::log(lid) << note << " ENDING" << Log::endl;
00127 }
00128 }
00129 if(annotate) {
00130 ANNOTATE_POP_PATH_ID(NULL, 0);
00131 ANNOTATE_END_TASK(NULL, 0, note.c_str());
00132 }
00133 }
00134 else {
00135 if(doLog) {
00136 Log::binaryLog(logId, ScopedLogReader_namespace::ScopedLogReader(false, false), level);
00137 }
00138 if(annotate) {
00139 ANNOTATE_NOTICE(NULL, 0, "%s", note.c_str());
00140 }
00141 }
00142 }
00143 }
00144
00145 protected:
00146 const std::string& note;
00147 const log_level_t level;
00148 const log_id_t logId;
00149 const bool prefix;
00150 const bool suffix;
00151 const bool doLog;
00152 const bool annotate;
00153
00154 };
00155
00160 #endif // _SCOPED_LOG_H