From 31a01bd0a67c43661e63e166956af9bfe629b7b9 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 31 May 2008 05:56:12 +0000 Subject: [PATCH] 2008-05-31 Tatsuhiro Tsujikawa Do not do write operation to /dev/null file. * src/LogFactory.cc * src/SimpleLogger.cc Replaced vasprintf with vsnprintf * src/SimpleLogger.cc (SimpleLogger::writeLog) --- ChangeLog | 9 +++++++++ src/LogFactory.cc | 6 +++++- src/SimpleLogger.cc | 41 ++++++++++++++++++++--------------------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 630eab5e..f82900b8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-05-31 Tatsuhiro Tsujikawa + + Do not do write operation to /dev/null file. + * src/LogFactory.cc + * src/SimpleLogger.cc + + Replaced vasprintf with vsnprintf + * src/SimpleLogger.cc (SimpleLogger::writeLog) + 2008-05-31 Tatsuhiro Tsujikawa * src/BtRequestMessage.cc diff --git a/src/LogFactory.cc b/src/LogFactory.cc index baaf42dd..aacbb43b 100644 --- a/src/LogFactory.cc +++ b/src/LogFactory.cc @@ -48,7 +48,11 @@ Logger::LEVEL LogFactory::_logLevel = Logger::DEBUG; Logger* LogFactory::getInstance() { if(logger == NULL) { SimpleLogger* slogger = new SimpleLogger(); - slogger->openFile(filename); + if(filename != DEV_NULL) { + // don't open file DEV_NULL for performance sake. + // This avoids costly unecessary message formatting and write. + slogger->openFile(filename); + } slogger->setLogLevel(_logLevel); if(_consoleOutput) { slogger->setStdout(Logger::NOTICE, true); diff --git a/src/SimpleLogger.cc b/src/SimpleLogger.cc index 537cf24f..d4d8f9e0 100644 --- a/src/SimpleLogger.cc +++ b/src/SimpleLogger.cc @@ -55,23 +55,23 @@ namespace aria2 { # endif #endif -#define WRITE_LOG(LEVEL, MSG) \ -if(LEVEL >= _logLevel){\ -va_list ap;\ -va_start(ap, MSG);\ -writeFile(LEVEL, MSG, ap);\ -flush();\ -va_end(ap);\ -} +#define WRITE_LOG(LEVEL, MSG) \ + if(LEVEL >= _logLevel && (stdoutField&LEVEL || file.is_open())) { \ + va_list ap; \ + va_start(ap, MSG); \ + writeFile(LEVEL, MSG, ap); \ + flush(); \ + va_end(ap); \ + } -#define WRITE_LOG_EX(LEVEL, MSG, EX) \ -if(LEVEL >= _logLevel) {\ -va_list ap;\ -va_start(ap, EX);\ -writeFile(LEVEL, MSG, ap);\ -writeStackTrace(LEVEL, EX);\ -flush();\ -va_end(ap);\ +#define WRITE_LOG_EX(LEVEL, MSG, EX) \ + if(LEVEL >= _logLevel && (stdoutField&LEVEL || file.is_open())) { \ + va_list ap; \ + va_start(ap, EX); \ + writeFile(LEVEL, MSG, ap); \ + writeStackTrace(LEVEL, EX); \ + flush(); \ + va_end(ap); \ } const std::string SimpleLogger::DEBUG("DEBUG"); @@ -153,12 +153,11 @@ void SimpleLogger::writeLog(std::ostream& o, Logger::LEVEL level, writeHeader(o, datestr, levelStr); } { - char* res; - if(vasprintf(&res, std::string(Util::replace(msg, A2STR::CR_C, A2STR::NIL)+A2STR::LF_C).c_str(), apCopy) == -1) { - o << "SimpleLogger error, cannot allocate memory.\n"; + char buf[1024]; + if(vsnprintf(buf, sizeof(buf), std::string(Util::replace(msg, A2STR::CR_C, A2STR::NIL)+A2STR::LF_C).c_str(), apCopy) < 0) { + o << "SimpleLogger error, failed to format message.\n"; } else { - o << res; - free(res); + o << buf; } } va_end(apCopy);