| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/logging_win.h" | 5 #include "base/logging_win.h" |
| 6 #include "base/atomicops.h" | 6 #include "base/atomicops.h" |
| 7 #include "base/singleton.h" | 7 #include "base/singleton.h" |
| 8 #include <initguid.h> // NOLINT | 8 #include <initguid.h> // NOLINT |
| 9 | 9 |
| 10 namespace { | 10 namespace { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 sizeof(intptr_t) - 1) / sizeof(intptr_t); | 34 sizeof(intptr_t) - 1) / sizeof(intptr_t); |
| 35 static intptr_t buffer_[kBufferSize]; | 35 static intptr_t buffer_[kBufferSize]; |
| 36 | 36 |
| 37 // Signal the object was already deleted, so it is not revived. | 37 // Signal the object was already deleted, so it is not revived. |
| 38 static base::subtle::Atomic32 dead_; | 38 static base::subtle::Atomic32 dead_; |
| 39 }; | 39 }; |
| 40 | 40 |
| 41 intptr_t LogEventProviderTraits::buffer_[kBufferSize]; | 41 intptr_t LogEventProviderTraits::buffer_[kBufferSize]; |
| 42 base::subtle::Atomic32 LogEventProviderTraits::dead_ = 0; | 42 base::subtle::Atomic32 LogEventProviderTraits::dead_ = 0; |
| 43 | 43 |
| 44 Singleton<logging::LogEventProvider, LogEventProviderTraits> log_provider; | |
| 45 | |
| 46 } // namespace | 44 } // namespace |
| 47 | 45 |
| 48 namespace logging { | 46 namespace logging { |
| 49 | 47 |
| 48 typedef Singleton<LogEventProvider, LogEventProviderTraits> |
| 49 LogEventProviderSingleton; |
| 50 |
| 50 DEFINE_GUID(kLogEventId, | 51 DEFINE_GUID(kLogEventId, |
| 51 0x7fe69228, 0x633e, 0x4f06, 0x80, 0xc1, 0x52, 0x7f, 0xea, 0x23, 0xe3, 0xa7); | 52 0x7fe69228, 0x633e, 0x4f06, 0x80, 0xc1, 0x52, 0x7f, 0xea, 0x23, 0xe3, 0xa7); |
| 52 | 53 |
| 53 LogEventProvider::LogEventProvider() : old_log_level_(LOG_NONE) { | 54 LogEventProvider::LogEventProvider() : old_log_level_(LOG_NONE) { |
| 54 } | 55 } |
| 55 | 56 |
| 56 bool LogEventProvider::LogMessage(int severity, const std::string& message) { | 57 bool LogEventProvider::LogMessage(int severity, const std::string& message) { |
| 57 EtwEventLevel level = TRACE_LEVEL_NONE; | 58 EtwEventLevel level = TRACE_LEVEL_NONE; |
| 58 | 59 |
| 59 // Convert the log severity to the most appropriate ETW trace level. | 60 // Convert the log severity to the most appropriate ETW trace level. |
| 60 switch (severity) { | 61 switch (severity) { |
| 61 case LOG_INFO: | 62 case LOG_INFO: |
| 62 level = TRACE_LEVEL_INFORMATION; | 63 level = TRACE_LEVEL_INFORMATION; |
| 63 break; | 64 break; |
| 64 case LOG_WARNING: | 65 case LOG_WARNING: |
| 65 level = TRACE_LEVEL_WARNING; | 66 level = TRACE_LEVEL_WARNING; |
| 66 break; | 67 break; |
| 67 case LOG_ERROR: | 68 case LOG_ERROR: |
| 68 case LOG_ERROR_REPORT: | 69 case LOG_ERROR_REPORT: |
| 69 level = TRACE_LEVEL_ERROR; | 70 level = TRACE_LEVEL_ERROR; |
| 70 break; | 71 break; |
| 71 case LOG_FATAL: | 72 case LOG_FATAL: |
| 72 level = TRACE_LEVEL_FATAL; | 73 level = TRACE_LEVEL_FATAL; |
| 73 break; | 74 break; |
| 74 }; | 75 }; |
| 75 | 76 |
| 76 // Bail if we're not logging, not at that level, | 77 // Bail if we're not logging, not at that level, |
| 77 // or if we're post-atexit handling. | 78 // or if we're post-atexit handling. |
| 78 LogEventProvider* provider = log_provider.get(); | 79 LogEventProvider* provider = LogEventProviderSingleton::get(); |
| 79 if (provider == NULL || level > provider->enable_level()) | 80 if (provider == NULL || level > provider->enable_level()) |
| 80 return false; | 81 return false; |
| 81 | 82 |
| 82 // And now log the event, with stack trace if one is | 83 // And now log the event, with stack trace if one is |
| 83 // requested per our enable flags. | 84 // requested per our enable flags. |
| 84 if (provider->enable_flags() & ENABLE_STACK_TRACE_CAPTURE) { | 85 if (provider->enable_flags() & ENABLE_STACK_TRACE_CAPTURE) { |
| 85 const size_t kMaxBacktraceDepth = 32; | 86 const size_t kMaxBacktraceDepth = 32; |
| 86 void* backtrace[kMaxBacktraceDepth]; | 87 void* backtrace[kMaxBacktraceDepth]; |
| 87 DWORD depth = CaptureStackBackTrace(2, kMaxBacktraceDepth, backtrace, NULL); | 88 DWORD depth = CaptureStackBackTrace(2, kMaxBacktraceDepth, backtrace, NULL); |
| 88 EtwMofEvent<3> event(kLogEventId, LOG_MESSAGE_WITH_STACKTRACE, level); | 89 EtwMofEvent<3> event(kLogEventId, LOG_MESSAGE_WITH_STACKTRACE, level); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 99 } | 100 } |
| 100 | 101 |
| 101 // Don't increase verbosity in other log destinations. | 102 // Don't increase verbosity in other log destinations. |
| 102 if (severity >= provider->old_log_level_) | 103 if (severity >= provider->old_log_level_) |
| 103 return true; | 104 return true; |
| 104 | 105 |
| 105 return false; | 106 return false; |
| 106 } | 107 } |
| 107 | 108 |
| 108 void LogEventProvider::Initialize(const GUID& provider_name) { | 109 void LogEventProvider::Initialize(const GUID& provider_name) { |
| 109 LogEventProvider* provider = log_provider.get(); | 110 LogEventProvider* provider = LogEventProviderSingleton::get(); |
| 110 | 111 |
| 111 provider->set_provider_name(provider_name); | 112 provider->set_provider_name(provider_name); |
| 112 provider->Register(); | 113 provider->Register(); |
| 113 | 114 |
| 114 // Register our message handler with logging. | 115 // Register our message handler with logging. |
| 115 SetLogMessageHandler(LogMessage); | 116 SetLogMessageHandler(LogMessage); |
| 116 } | 117 } |
| 117 | 118 |
| 118 void LogEventProvider::Uninitialize() { | 119 void LogEventProvider::Uninitialize() { |
| 119 log_provider.get()->Unregister(); | 120 LogEventProviderSingleton::get()->Unregister(); |
| 120 } | 121 } |
| 121 | 122 |
| 122 void LogEventProvider::OnEventsEnabled() { | 123 void LogEventProvider::OnEventsEnabled() { |
| 123 // Grab the old log level so we can restore it later. | 124 // Grab the old log level so we can restore it later. |
| 124 old_log_level_ = GetMinLogLevel(); | 125 old_log_level_ = GetMinLogLevel(); |
| 125 | 126 |
| 126 // Convert the new trace level to a logging severity | 127 // Convert the new trace level to a logging severity |
| 127 // and enable logging at that level. | 128 // and enable logging at that level. |
| 128 EtwEventLevel level = enable_level(); | 129 EtwEventLevel level = enable_level(); |
| 129 switch (level) { | 130 switch (level) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 143 break; | 144 break; |
| 144 } | 145 } |
| 145 } | 146 } |
| 146 | 147 |
| 147 void LogEventProvider::OnEventsDisabled() { | 148 void LogEventProvider::OnEventsDisabled() { |
| 148 // Restore the old log level. | 149 // Restore the old log level. |
| 149 SetMinLogLevel(old_log_level_); | 150 SetMinLogLevel(old_log_level_); |
| 150 } | 151 } |
| 151 | 152 |
| 152 } // namespace logging | 153 } // namespace logging |
| OLD | NEW |