| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/base/net_log.h" | 5 #include "net/base/net_log.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 return base::Bind(&SourceEventParametersCallback, *this); | 98 return base::Bind(&SourceEventParametersCallback, *this); |
| 99 } | 99 } |
| 100 | 100 |
| 101 // static | 101 // static |
| 102 bool NetLog::Source::FromEventParameters(base::Value* event_params, | 102 bool NetLog::Source::FromEventParameters(base::Value* event_params, |
| 103 Source* source) { | 103 Source* source) { |
| 104 base::DictionaryValue* dict = NULL; | 104 base::DictionaryValue* dict = NULL; |
| 105 base::DictionaryValue* source_dict = NULL; | 105 base::DictionaryValue* source_dict = NULL; |
| 106 int source_id = -1; | 106 int source_id = -1; |
| 107 int source_type = NetLog::SOURCE_COUNT; | 107 int source_type = NetLog::SOURCE_COUNT; |
| 108 if (!event_params || | 108 if (!event_params || !event_params->GetAsDictionary(&dict) || |
| 109 !event_params->GetAsDictionary(&dict) || | |
| 110 !dict->GetDictionary("source_dependency", &source_dict) || | 109 !dict->GetDictionary("source_dependency", &source_dict) || |
| 111 !source_dict->GetInteger("id", &source_id) || | 110 !source_dict->GetInteger("id", &source_id) || |
| 112 !source_dict->GetInteger("type", &source_type)) { | 111 !source_dict->GetInteger("type", &source_type)) { |
| 113 *source = Source(); | 112 *source = Source(); |
| 114 return false; | 113 return false; |
| 115 } | 114 } |
| 116 | 115 |
| 117 DCHECK_GE(source_id, 0); | 116 DCHECK_GE(source_id, 0); |
| 118 DCHECK_LT(source_type, NetLog::SOURCE_COUNT); | 117 DCHECK_LT(source_type, NetLog::SOURCE_COUNT); |
| 119 *source = Source(static_cast<SourceType>(source_type), source_id); | 118 *source = Source(static_cast<SourceType>(source_type), source_id); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 144 | 143 |
| 145 return entry_dict; | 144 return entry_dict; |
| 146 } | 145 } |
| 147 | 146 |
| 148 base::Value* NetLog::Entry::ParametersToValue() const { | 147 base::Value* NetLog::Entry::ParametersToValue() const { |
| 149 if (data_->parameters_callback) | 148 if (data_->parameters_callback) |
| 150 return data_->parameters_callback->Run(log_level_); | 149 return data_->parameters_callback->Run(log_level_); |
| 151 return NULL; | 150 return NULL; |
| 152 } | 151 } |
| 153 | 152 |
| 154 NetLog::EntryData::EntryData( | 153 NetLog::EntryData::EntryData(EventType type, |
| 155 EventType type, | 154 Source source, |
| 156 Source source, | 155 EventPhase phase, |
| 157 EventPhase phase, | 156 base::TimeTicks time, |
| 158 base::TimeTicks time, | 157 const ParametersCallback* parameters_callback) |
| 159 const ParametersCallback* parameters_callback) | |
| 160 : type(type), | 158 : type(type), |
| 161 source(source), | 159 source(source), |
| 162 phase(phase), | 160 phase(phase), |
| 163 time(time), | 161 time(time), |
| 164 parameters_callback(parameters_callback) { | 162 parameters_callback(parameters_callback) { |
| 165 } | 163 } |
| 166 | 164 |
| 167 NetLog::EntryData::~EntryData() { | 165 NetLog::EntryData::~EntryData() { |
| 168 } | 166 } |
| 169 | 167 |
| 170 NetLog::Entry::Entry(const EntryData* data, LogLevel log_level) | 168 NetLog::Entry::Entry(const EntryData* data, LogLevel log_level) |
| 171 : data_(data), log_level_(log_level) { | 169 : data_(data), log_level_(log_level) { |
| 172 } | 170 } |
| 173 | 171 |
| 174 NetLog::Entry::~Entry() { | 172 NetLog::Entry::~Entry() { |
| 175 } | 173 } |
| 176 | 174 |
| 177 NetLog::ThreadSafeObserver::ThreadSafeObserver() : log_level_(LOG_NONE), | 175 NetLog::ThreadSafeObserver::ThreadSafeObserver() |
| 178 net_log_(NULL) { | 176 : log_level_(LOG_NONE), net_log_(NULL) { |
| 179 } | 177 } |
| 180 | 178 |
| 181 NetLog::ThreadSafeObserver::~ThreadSafeObserver() { | 179 NetLog::ThreadSafeObserver::~ThreadSafeObserver() { |
| 182 // Make sure we aren't watching a NetLog on destruction. Because the NetLog | 180 // Make sure we aren't watching a NetLog on destruction. Because the NetLog |
| 183 // may pass events to each observer on multiple threads, we cannot safely | 181 // may pass events to each observer on multiple threads, we cannot safely |
| 184 // stop watching a NetLog automatically from a parent class. | 182 // stop watching a NetLog automatically from a parent class. |
| 185 DCHECK(!net_log_); | 183 DCHECK(!net_log_); |
| 186 } | 184 } |
| 187 | 185 |
| 188 NetLog::LogLevel NetLog::ThreadSafeObserver::log_level() const { | 186 NetLog::LogLevel NetLog::ThreadSafeObserver::log_level() const { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 uint32 NetLog::NextID() { | 221 uint32 NetLog::NextID() { |
| 224 return base::subtle::NoBarrier_AtomicIncrement(&last_id_, 1); | 222 return base::subtle::NoBarrier_AtomicIncrement(&last_id_, 1); |
| 225 } | 223 } |
| 226 | 224 |
| 227 NetLog::LogLevel NetLog::GetLogLevel() const { | 225 NetLog::LogLevel NetLog::GetLogLevel() const { |
| 228 base::subtle::Atomic32 log_level = | 226 base::subtle::Atomic32 log_level = |
| 229 base::subtle::NoBarrier_Load(&effective_log_level_); | 227 base::subtle::NoBarrier_Load(&effective_log_level_); |
| 230 return static_cast<net::NetLog::LogLevel>(log_level); | 228 return static_cast<net::NetLog::LogLevel>(log_level); |
| 231 } | 229 } |
| 232 | 230 |
| 233 void NetLog::AddThreadSafeObserver( | 231 void NetLog::AddThreadSafeObserver(net::NetLog::ThreadSafeObserver* observer, |
| 234 net::NetLog::ThreadSafeObserver* observer, | 232 LogLevel log_level) { |
| 235 LogLevel log_level) { | |
| 236 DCHECK_NE(LOG_NONE, log_level); | 233 DCHECK_NE(LOG_NONE, log_level); |
| 237 base::AutoLock lock(lock_); | 234 base::AutoLock lock(lock_); |
| 238 | 235 |
| 239 DCHECK(!observer->net_log_); | 236 DCHECK(!observer->net_log_); |
| 240 DCHECK_EQ(LOG_NONE, observer->log_level_); | 237 DCHECK_EQ(LOG_NONE, observer->log_level_); |
| 241 observers_.AddObserver(observer); | 238 observers_.AddObserver(observer); |
| 242 observer->net_log_ = this; | 239 observer->net_log_ = this; |
| 243 observer->log_level_ = log_level; | 240 observer->log_level_ = log_level; |
| 244 UpdateLogLevel(); | 241 UpdateLogLevel(); |
| 245 } | 242 } |
| 246 | 243 |
| 247 void NetLog::SetObserverLogLevel( | 244 void NetLog::SetObserverLogLevel(net::NetLog::ThreadSafeObserver* observer, |
| 248 net::NetLog::ThreadSafeObserver* observer, | 245 LogLevel log_level) { |
| 249 LogLevel log_level) { | |
| 250 DCHECK_NE(LOG_NONE, log_level); | 246 DCHECK_NE(LOG_NONE, log_level); |
| 251 base::AutoLock lock(lock_); | 247 base::AutoLock lock(lock_); |
| 252 | 248 |
| 253 DCHECK(observers_.HasObserver(observer)); | 249 DCHECK(observers_.HasObserver(observer)); |
| 254 DCHECK_EQ(this, observer->net_log_); | 250 DCHECK_EQ(this, observer->net_log_); |
| 255 DCHECK_NE(LOG_NONE, observer->log_level_); | 251 DCHECK_NE(LOG_NONE, observer->log_level_); |
| 256 observer->log_level_ = log_level; | 252 observer->log_level_ = log_level; |
| 257 UpdateLogLevel(); | 253 UpdateLogLevel(); |
| 258 } | 254 } |
| 259 | 255 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 275 | 271 |
| 276 // Look through all the observers and find the finest granularity | 272 // Look through all the observers and find the finest granularity |
| 277 // log level (higher values of the enum imply *lower* log levels). | 273 // log level (higher values of the enum imply *lower* log levels). |
| 278 LogLevel new_effective_log_level = LOG_NONE; | 274 LogLevel new_effective_log_level = LOG_NONE; |
| 279 ObserverListBase<ThreadSafeObserver>::Iterator it(observers_); | 275 ObserverListBase<ThreadSafeObserver>::Iterator it(observers_); |
| 280 ThreadSafeObserver* observer; | 276 ThreadSafeObserver* observer; |
| 281 while ((observer = it.GetNext()) != NULL) { | 277 while ((observer = it.GetNext()) != NULL) { |
| 282 new_effective_log_level = | 278 new_effective_log_level = |
| 283 std::min(new_effective_log_level, observer->log_level()); | 279 std::min(new_effective_log_level, observer->log_level()); |
| 284 } | 280 } |
| 285 base::subtle::NoBarrier_Store(&effective_log_level_, | 281 base::subtle::NoBarrier_Store(&effective_log_level_, new_effective_log_level); |
| 286 new_effective_log_level); | |
| 287 } | 282 } |
| 288 | 283 |
| 289 // static | 284 // static |
| 290 std::string NetLog::TickCountToString(const base::TimeTicks& time) { | 285 std::string NetLog::TickCountToString(const base::TimeTicks& time) { |
| 291 int64 delta_time = (time - base::TimeTicks()).InMilliseconds(); | 286 int64 delta_time = (time - base::TimeTicks()).InMilliseconds(); |
| 292 return base::Int64ToString(delta_time); | 287 return base::Int64ToString(delta_time); |
| 293 } | 288 } |
| 294 | 289 |
| 295 // static | 290 // static |
| 296 const char* NetLog::EventTypeToString(EventType event) { | 291 const char* NetLog::EventTypeToString(EventType event) { |
| 297 switch (event) { | 292 switch (event) { |
| 298 #define EVENT_TYPE(label) case TYPE_ ## label: return #label; | 293 #define EVENT_TYPE(label) \ |
| 294 case TYPE_##label: \ |
| 295 return #label; |
| 299 #include "net/base/net_log_event_type_list.h" | 296 #include "net/base/net_log_event_type_list.h" |
| 300 #undef EVENT_TYPE | 297 #undef EVENT_TYPE |
| 301 default: | 298 default: |
| 302 NOTREACHED(); | 299 NOTREACHED(); |
| 303 return NULL; | 300 return NULL; |
| 304 } | 301 } |
| 305 } | 302 } |
| 306 | 303 |
| 307 // static | 304 // static |
| 308 base::Value* NetLog::GetEventTypesAsValue() { | 305 base::Value* NetLog::GetEventTypesAsValue() { |
| 309 base::DictionaryValue* dict = new base::DictionaryValue(); | 306 base::DictionaryValue* dict = new base::DictionaryValue(); |
| 310 for (int i = 0; i < EVENT_COUNT; ++i) { | 307 for (int i = 0; i < EVENT_COUNT; ++i) { |
| 311 dict->SetInteger(EventTypeToString(static_cast<EventType>(i)), i); | 308 dict->SetInteger(EventTypeToString(static_cast<EventType>(i)), i); |
| 312 } | 309 } |
| 313 return dict; | 310 return dict; |
| 314 } | 311 } |
| 315 | 312 |
| 316 // static | 313 // static |
| 317 const char* NetLog::SourceTypeToString(SourceType source) { | 314 const char* NetLog::SourceTypeToString(SourceType source) { |
| 318 switch (source) { | 315 switch (source) { |
| 319 #define SOURCE_TYPE(label) case SOURCE_ ## label: return #label; | 316 #define SOURCE_TYPE(label) \ |
| 317 case SOURCE_##label: \ |
| 318 return #label; |
| 320 #include "net/base/net_log_source_type_list.h" | 319 #include "net/base/net_log_source_type_list.h" |
| 321 #undef SOURCE_TYPE | 320 #undef SOURCE_TYPE |
| 322 default: | 321 default: |
| 323 NOTREACHED(); | 322 NOTREACHED(); |
| 324 return NULL; | 323 return NULL; |
| 325 } | 324 } |
| 326 } | 325 } |
| 327 | 326 |
| 328 // static | 327 // static |
| 329 base::Value* NetLog::GetSourceTypesAsValue() { | 328 base::Value* NetLog::GetSourceTypesAsValue() { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 DCHECK(value); | 382 DCHECK(value); |
| 384 return base::Bind(&NetLogString16Callback, name, value); | 383 return base::Bind(&NetLogString16Callback, name, value); |
| 385 } | 384 } |
| 386 | 385 |
| 387 void NetLog::AddEntry(EventType type, | 386 void NetLog::AddEntry(EventType type, |
| 388 const Source& source, | 387 const Source& source, |
| 389 EventPhase phase, | 388 EventPhase phase, |
| 390 const NetLog::ParametersCallback* parameters_callback) { | 389 const NetLog::ParametersCallback* parameters_callback) { |
| 391 if (GetLogLevel() == LOG_NONE) | 390 if (GetLogLevel() == LOG_NONE) |
| 392 return; | 391 return; |
| 393 EntryData entry_data(type, source, phase, base::TimeTicks::Now(), | 392 EntryData entry_data( |
| 394 parameters_callback); | 393 type, source, phase, base::TimeTicks::Now(), parameters_callback); |
| 395 | 394 |
| 396 // Notify all of the log observers. | 395 // Notify all of the log observers. |
| 397 base::AutoLock lock(lock_); | 396 base::AutoLock lock(lock_); |
| 398 FOR_EACH_OBSERVER(ThreadSafeObserver, observers_, OnAddEntryData(entry_data)); | 397 FOR_EACH_OBSERVER(ThreadSafeObserver, observers_, OnAddEntryData(entry_data)); |
| 399 } | 398 } |
| 400 | 399 |
| 401 void BoundNetLog::AddEntry(NetLog::EventType type, | 400 void BoundNetLog::AddEntry(NetLog::EventType type, |
| 402 NetLog::EventPhase phase) const { | 401 NetLog::EventPhase phase) const { |
| 403 if (!net_log_) | 402 if (!net_log_) |
| 404 return; | 403 return; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 | 477 |
| 479 bool BoundNetLog::IsLoggingBytes() const { | 478 bool BoundNetLog::IsLoggingBytes() const { |
| 480 return NetLog::IsLoggingBytes(GetLogLevel()); | 479 return NetLog::IsLoggingBytes(GetLogLevel()); |
| 481 } | 480 } |
| 482 | 481 |
| 483 bool BoundNetLog::IsLogging() const { | 482 bool BoundNetLog::IsLogging() const { |
| 484 return NetLog::IsLogging(GetLogLevel()); | 483 return NetLog::IsLogging(GetLogLevel()); |
| 485 } | 484 } |
| 486 | 485 |
| 487 // static | 486 // static |
| 488 BoundNetLog BoundNetLog::Make(NetLog* net_log, | 487 BoundNetLog BoundNetLog::Make(NetLog* net_log, NetLog::SourceType source_type) { |
| 489 NetLog::SourceType source_type) { | |
| 490 if (!net_log) | 488 if (!net_log) |
| 491 return BoundNetLog(); | 489 return BoundNetLog(); |
| 492 | 490 |
| 493 NetLog::Source source(source_type, net_log->NextID()); | 491 NetLog::Source source(source_type, net_log->NextID()); |
| 494 return BoundNetLog(source, net_log); | 492 return BoundNetLog(source, net_log); |
| 495 } | 493 } |
| 496 | 494 |
| 497 } // namespace net | 495 } // namespace net |
| OLD | NEW |