1// 2// Logging support functions. These are designed to mimic those used in 3// chromium_org/base in terms of interface, but to redirect error to 4// the system log. 5// 6 7#define LOG_TAG "perf_reader" 8 9#include "quipper/base/logging.h" 10 11#if defined(OS_POSIX) 12#include <errno.h> 13#include <pthread.h> 14#include <stdio.h> 15#include <stdlib.h> 16#include <string.h> 17#include <unistd.h> 18#endif 19 20#include <algorithm> 21#include <cstring> 22#include <ctime> 23#include <iomanip> 24#include <ostream> 25#include <string> 26 27#include <android/log.h> 28 29namespace logging { 30 31namespace { 32 33int min_log_level = 0; 34 35} 36 37void SetMinLogLevel(int level) { 38 min_log_level = std::min(LOG_FATAL, level); 39} 40 41int GetMinLogLevel() { 42 return min_log_level; 43} 44 45// MSVC doesn't like complex extern templates and DLLs. 46#if !defined(COMPILER_MSVC) 47// Explicit instantiations for commonly used comparisons. 48template std::string* MakeCheckOpString<int, int>( 49 const int&, const int&, const char* names); 50template std::string* MakeCheckOpString<unsigned long, unsigned long>( 51 const unsigned long&, const unsigned long&, const char* names); 52template std::string* MakeCheckOpString<unsigned long, unsigned int>( 53 const unsigned long&, const unsigned int&, const char* names); 54template std::string* MakeCheckOpString<unsigned int, unsigned long>( 55 const unsigned int&, const unsigned long&, const char* names); 56template std::string* MakeCheckOpString<std::string, std::string>( 57 const std::string&, const std::string&, const char* name); 58#endif 59 60LogMessage::LogMessage(const char* file, int line, LogSeverity severity) 61 : severity_(severity), file_(file), line_(line) { 62 Init(file, line); 63} 64 65LogMessage::LogMessage(const char* file, int line, std::string* result) 66 : severity_(LOG_FATAL), file_(file), line_(line) { 67 Init(file, line); 68 stream_ << "Check failed: " << *result; 69 delete result; 70} 71 72LogMessage::LogMessage(const char* file, int line, LogSeverity severity, 73 std::string* result) 74 : severity_(severity), file_(file), line_(line) { 75 Init(file, line); 76 stream_ << "Check failed: " << *result; 77 delete result; 78} 79 80LogMessage::~LogMessage() { 81 stream_ << std::endl; 82 std::string str_newline(stream_.str()); 83 84 android_LogPriority priority = 85 (severity_ < 0) ? ANDROID_LOG_VERBOSE : ANDROID_LOG_UNKNOWN; 86 switch (severity_) { 87 case LOG_INFO: 88 priority = ANDROID_LOG_INFO; 89 break; 90 case LOG_WARNING: 91 priority = ANDROID_LOG_WARN; 92 break; 93 case LOG_ERROR: 94 priority = ANDROID_LOG_ERROR; 95 break; 96 case LOG_FATAL: 97 priority = ANDROID_LOG_FATAL; 98 break; 99 } 100 __android_log_write(priority, LOG_TAG, str_newline.c_str()); 101 102 if (severity_ == LOG_FATAL) { 103 exit(9); 104 } 105} 106 107void LogMessage::Init(const char* /* file */, int /* line */) { 108} 109 110} // namespace logging 111