// // Logging support functions. These are designed to mimic those used in // chromium_org/base in terms of interface, but to redirect error to // the system log. // #define LOG_TAG "perf_reader" #include "quipper/base/logging.h" #if defined(OS_POSIX) #include <errno.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #endif #include <algorithm> #include <cstring> #include <ctime> #include <iomanip> #include <ostream> #include <string> #include <android/log.h> namespace logging { namespace { int min_log_level = 0; } void SetMinLogLevel(int level) { min_log_level = std::min(LOG_FATAL, level); } int GetMinLogLevel() { return min_log_level; } // MSVC doesn't like complex extern templates and DLLs. #if !defined(COMPILER_MSVC) // Explicit instantiations for commonly used comparisons. template std::string* MakeCheckOpString<int, int>( const int&, const int&, const char* names); template std::string* MakeCheckOpString<unsigned long, unsigned long>( const unsigned long&, const unsigned long&, const char* names); template std::string* MakeCheckOpString<unsigned long, unsigned int>( const unsigned long&, const unsigned int&, const char* names); template std::string* MakeCheckOpString<unsigned int, unsigned long>( const unsigned int&, const unsigned long&, const char* names); template std::string* MakeCheckOpString<std::string, std::string>( const std::string&, const std::string&, const char* name); #endif LogMessage::LogMessage(const char* file, int line, LogSeverity severity) : severity_(severity), file_(file), line_(line) { Init(file, line); } LogMessage::LogMessage(const char* file, int line, std::string* result) : severity_(LOG_FATAL), file_(file), line_(line) { Init(file, line); stream_ << "Check failed: " << *result; delete result; } LogMessage::LogMessage(const char* file, int line, LogSeverity severity, std::string* result) : severity_(severity), file_(file), line_(line) { Init(file, line); stream_ << "Check failed: " << *result; delete result; } LogMessage::~LogMessage() { stream_ << std::endl; std::string str_newline(stream_.str()); android_LogPriority priority = (severity_ < 0) ? ANDROID_LOG_VERBOSE : ANDROID_LOG_UNKNOWN; switch (severity_) { case LOG_INFO: priority = ANDROID_LOG_INFO; break; case LOG_WARNING: priority = ANDROID_LOG_WARN; break; case LOG_ERROR: priority = ANDROID_LOG_ERROR; break; case LOG_FATAL: priority = ANDROID_LOG_FATAL; break; } __android_log_write(priority, LOG_TAG, str_newline.c_str()); if (severity_ == LOG_FATAL) { exit(9); } } void LogMessage::Init(const char* /* file */, int /* line */) { } } // namespace logging