| // |
| // 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. |
| // |
| |
| #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> |
| |
| #define LOG_TAG "perf_reader" |
| |
| 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 |