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; | 104 base::DictionaryValue* dict; |
105 base::DictionaryValue* source_dict; | 105 base::DictionaryValue* source_dict; |
106 int source_id; | 106 int source_id; |
107 int source_type; | 107 int source_type; |
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_LE(0, source_id); | 116 DCHECK_LE(0, source_id); |
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 { |
189 DCHECK(net_log_); | 187 DCHECK(net_log_); |
190 return log_level_; | 188 return log_level_; |
191 } | 189 } |
192 | 190 |
193 NetLog* NetLog::ThreadSafeObserver::net_log() const { | 191 NetLog* NetLog::ThreadSafeObserver::net_log() const { |
194 return net_log_; | 192 return net_log_; |
195 } | 193 } |
196 | 194 |
197 void NetLog::ThreadSafeObserver::OnAddEntryData(const EntryData& entry_data) { | 195 void NetLog::ThreadSafeObserver::OnAddEntryData(const EntryData& entry_data) { |
198 OnAddEntry(Entry(&entry_data, log_level())); | 196 OnAddEntry(Entry(&entry_data, log_level())); |
199 } | 197 } |
200 | 198 |
201 NetLog::NetLog() | 199 NetLog::NetLog() |
202 : last_id_(0), | 200 : last_id_(0), base_log_level_(LOG_NONE), effective_log_level_(LOG_NONE) { |
203 base_log_level_(LOG_NONE), | |
204 effective_log_level_(LOG_NONE) { | |
205 } | 201 } |
206 | 202 |
207 NetLog::~NetLog() { | 203 NetLog::~NetLog() { |
208 } | 204 } |
209 | 205 |
210 void NetLog::AddGlobalEntry(EventType type) { | 206 void NetLog::AddGlobalEntry(EventType type) { |
211 AddEntry(type, | 207 AddEntry(type, |
212 Source(net::NetLog::SOURCE_NONE, NextID()), | 208 Source(net::NetLog::SOURCE_NONE, NextID()), |
213 net::NetLog::PHASE_NONE, | 209 net::NetLog::PHASE_NONE, |
214 NULL); | 210 NULL); |
(...skipping 18 matching lines...) Expand all Loading... |
233 | 229 |
234 UpdateLogLevel(); | 230 UpdateLogLevel(); |
235 } | 231 } |
236 | 232 |
237 NetLog::LogLevel NetLog::GetLogLevel() const { | 233 NetLog::LogLevel NetLog::GetLogLevel() const { |
238 base::subtle::Atomic32 log_level = | 234 base::subtle::Atomic32 log_level = |
239 base::subtle::NoBarrier_Load(&effective_log_level_); | 235 base::subtle::NoBarrier_Load(&effective_log_level_); |
240 return static_cast<net::NetLog::LogLevel>(log_level); | 236 return static_cast<net::NetLog::LogLevel>(log_level); |
241 } | 237 } |
242 | 238 |
243 void NetLog::AddThreadSafeObserver( | 239 void NetLog::AddThreadSafeObserver(net::NetLog::ThreadSafeObserver* observer, |
244 net::NetLog::ThreadSafeObserver* observer, | 240 LogLevel log_level) { |
245 LogLevel log_level) { | |
246 DCHECK_NE(LOG_NONE, log_level); | 241 DCHECK_NE(LOG_NONE, log_level); |
247 base::AutoLock lock(lock_); | 242 base::AutoLock lock(lock_); |
248 | 243 |
249 DCHECK(!observer->net_log_); | 244 DCHECK(!observer->net_log_); |
250 DCHECK_EQ(LOG_NONE, observer->log_level_); | 245 DCHECK_EQ(LOG_NONE, observer->log_level_); |
251 observers_.AddObserver(observer); | 246 observers_.AddObserver(observer); |
252 observer->net_log_ = this; | 247 observer->net_log_ = this; |
253 observer->log_level_ = log_level; | 248 observer->log_level_ = log_level; |
254 UpdateLogLevel(); | 249 UpdateLogLevel(); |
255 } | 250 } |
256 | 251 |
257 void NetLog::SetObserverLogLevel( | 252 void NetLog::SetObserverLogLevel(net::NetLog::ThreadSafeObserver* observer, |
258 net::NetLog::ThreadSafeObserver* observer, | 253 LogLevel log_level) { |
259 LogLevel log_level) { | |
260 DCHECK_NE(LOG_NONE, log_level); | 254 DCHECK_NE(LOG_NONE, log_level); |
261 base::AutoLock lock(lock_); | 255 base::AutoLock lock(lock_); |
262 | 256 |
263 DCHECK(observers_.HasObserver(observer)); | 257 DCHECK(observers_.HasObserver(observer)); |
264 DCHECK_EQ(this, observer->net_log_); | 258 DCHECK_EQ(this, observer->net_log_); |
265 DCHECK_NE(LOG_NONE, observer->log_level_); | 259 DCHECK_NE(LOG_NONE, observer->log_level_); |
266 observer->log_level_ = log_level; | 260 observer->log_level_ = log_level; |
267 UpdateLogLevel(); | 261 UpdateLogLevel(); |
268 } | 262 } |
269 | 263 |
(...skipping 15 matching lines...) Expand all Loading... |
285 | 279 |
286 // Look through all the observers and find the finest granularity | 280 // Look through all the observers and find the finest granularity |
287 // log level (higher values of the enum imply *lower* log levels). | 281 // log level (higher values of the enum imply *lower* log levels). |
288 LogLevel new_effective_log_level = base_log_level_; | 282 LogLevel new_effective_log_level = base_log_level_; |
289 ObserverListBase<ThreadSafeObserver>::Iterator it(observers_); | 283 ObserverListBase<ThreadSafeObserver>::Iterator it(observers_); |
290 ThreadSafeObserver* observer; | 284 ThreadSafeObserver* observer; |
291 while ((observer = it.GetNext()) != NULL) { | 285 while ((observer = it.GetNext()) != NULL) { |
292 new_effective_log_level = | 286 new_effective_log_level = |
293 std::min(new_effective_log_level, observer->log_level()); | 287 std::min(new_effective_log_level, observer->log_level()); |
294 } | 288 } |
295 base::subtle::NoBarrier_Store(&effective_log_level_, | 289 base::subtle::NoBarrier_Store(&effective_log_level_, new_effective_log_level); |
296 new_effective_log_level); | |
297 } | 290 } |
298 | 291 |
299 // static | 292 // static |
300 std::string NetLog::TickCountToString(const base::TimeTicks& time) { | 293 std::string NetLog::TickCountToString(const base::TimeTicks& time) { |
301 int64 delta_time = (time - base::TimeTicks()).InMilliseconds(); | 294 int64 delta_time = (time - base::TimeTicks()).InMilliseconds(); |
302 return base::Int64ToString(delta_time); | 295 return base::Int64ToString(delta_time); |
303 } | 296 } |
304 | 297 |
305 // static | 298 // static |
306 const char* NetLog::EventTypeToString(EventType event) { | 299 const char* NetLog::EventTypeToString(EventType event) { |
307 switch (event) { | 300 switch (event) { |
308 #define EVENT_TYPE(label) case TYPE_ ## label: return #label; | 301 #define EVENT_TYPE(label) \ |
| 302 case TYPE_##label: \ |
| 303 return #label; |
309 #include "net/base/net_log_event_type_list.h" | 304 #include "net/base/net_log_event_type_list.h" |
310 #undef EVENT_TYPE | 305 #undef EVENT_TYPE |
311 default: | 306 default: |
312 NOTREACHED(); | 307 NOTREACHED(); |
313 return NULL; | 308 return NULL; |
314 } | 309 } |
315 } | 310 } |
316 | 311 |
317 // static | 312 // static |
318 base::Value* NetLog::GetEventTypesAsValue() { | 313 base::Value* NetLog::GetEventTypesAsValue() { |
319 base::DictionaryValue* dict = new base::DictionaryValue(); | 314 base::DictionaryValue* dict = new base::DictionaryValue(); |
320 for (int i = 0; i < EVENT_COUNT; ++i) { | 315 for (int i = 0; i < EVENT_COUNT; ++i) { |
321 dict->SetInteger(EventTypeToString(static_cast<EventType>(i)), i); | 316 dict->SetInteger(EventTypeToString(static_cast<EventType>(i)), i); |
322 } | 317 } |
323 return dict; | 318 return dict; |
324 } | 319 } |
325 | 320 |
326 // static | 321 // static |
327 const char* NetLog::SourceTypeToString(SourceType source) { | 322 const char* NetLog::SourceTypeToString(SourceType source) { |
328 switch (source) { | 323 switch (source) { |
329 #define SOURCE_TYPE(label) case SOURCE_ ## label: return #label; | 324 #define SOURCE_TYPE(label) \ |
| 325 case SOURCE_##label: \ |
| 326 return #label; |
330 #include "net/base/net_log_source_type_list.h" | 327 #include "net/base/net_log_source_type_list.h" |
331 #undef SOURCE_TYPE | 328 #undef SOURCE_TYPE |
332 default: | 329 default: |
333 NOTREACHED(); | 330 NOTREACHED(); |
334 return NULL; | 331 return NULL; |
335 } | 332 } |
336 } | 333 } |
337 | 334 |
338 // static | 335 // static |
339 base::Value* NetLog::GetSourceTypesAsValue() { | 336 base::Value* NetLog::GetSourceTypesAsValue() { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 DCHECK(value); | 390 DCHECK(value); |
394 return base::Bind(&NetLogString16Callback, name, value); | 391 return base::Bind(&NetLogString16Callback, name, value); |
395 } | 392 } |
396 | 393 |
397 void NetLog::AddEntry(EventType type, | 394 void NetLog::AddEntry(EventType type, |
398 const Source& source, | 395 const Source& source, |
399 EventPhase phase, | 396 EventPhase phase, |
400 const NetLog::ParametersCallback* parameters_callback) { | 397 const NetLog::ParametersCallback* parameters_callback) { |
401 if (GetLogLevel() == LOG_NONE) | 398 if (GetLogLevel() == LOG_NONE) |
402 return; | 399 return; |
403 EntryData entry_data(type, source, phase, base::TimeTicks::Now(), | 400 EntryData entry_data( |
404 parameters_callback); | 401 type, source, phase, base::TimeTicks::Now(), parameters_callback); |
405 | 402 |
406 // Notify all of the log observers. | 403 // Notify all of the log observers. |
407 base::AutoLock lock(lock_); | 404 base::AutoLock lock(lock_); |
408 FOR_EACH_OBSERVER(ThreadSafeObserver, observers_, OnAddEntryData(entry_data)); | 405 FOR_EACH_OBSERVER(ThreadSafeObserver, observers_, OnAddEntryData(entry_data)); |
409 } | 406 } |
410 | 407 |
411 void BoundNetLog::AddEntry(NetLog::EventType type, | 408 void BoundNetLog::AddEntry(NetLog::EventType type, |
412 NetLog::EventPhase phase) const { | 409 NetLog::EventPhase phase) const { |
413 if (!net_log_) | 410 if (!net_log_) |
414 return; | 411 return; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 | 485 |
489 bool BoundNetLog::IsLoggingBytes() const { | 486 bool BoundNetLog::IsLoggingBytes() const { |
490 return NetLog::IsLoggingBytes(GetLogLevel()); | 487 return NetLog::IsLoggingBytes(GetLogLevel()); |
491 } | 488 } |
492 | 489 |
493 bool BoundNetLog::IsLogging() const { | 490 bool BoundNetLog::IsLogging() const { |
494 return NetLog::IsLogging(GetLogLevel()); | 491 return NetLog::IsLogging(GetLogLevel()); |
495 } | 492 } |
496 | 493 |
497 // static | 494 // static |
498 BoundNetLog BoundNetLog::Make(NetLog* net_log, | 495 BoundNetLog BoundNetLog::Make(NetLog* net_log, NetLog::SourceType source_type) { |
499 NetLog::SourceType source_type) { | |
500 if (!net_log) | 496 if (!net_log) |
501 return BoundNetLog(); | 497 return BoundNetLog(); |
502 | 498 |
503 NetLog::Source source(source_type, net_log->NextID()); | 499 NetLog::Source source(source_type, net_log->NextID()); |
504 return BoundNetLog(source, net_log); | 500 return BoundNetLog(source, net_log); |
505 } | 501 } |
506 | 502 |
507 } // namespace net | 503 } // namespace net |
OLD | NEW |