blob: 9fbe4e68351d28d82f3d2cb5db3bb912878608aa [file] [log] [blame]
[email protected]988394e2012-02-22 16:37:551// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]9e743cd2010-03-16 07:03:532// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
eroman87c53d62015-04-02 06:51:075#include "net/log/net_log.h"
[email protected]f6f1bebc2011-01-07 03:04:546
[email protected]4b355212013-06-11 10:35:197#include "base/strings/string_number_conversions.h"
[email protected]d13f51b2010-04-27 23:20:458#include "base/values.h"
Eric Roman06bd9742019-07-13 15:19:139#include "net/log/net_log_values.h"
[email protected]9e743cd2010-03-16 07:03:5310
11namespace net {
12
Eric Roman3124cde2019-07-10 22:26:1513NetLog::ThreadSafeObserver::ThreadSafeObserver()
14 : capture_mode_(NetLogCaptureMode::kDefault), net_log_(nullptr) {}
[email protected]ae6e9912011-07-27 01:18:2815
16NetLog::ThreadSafeObserver::~ThreadSafeObserver() {
[email protected]d5cbd92a2012-02-29 12:43:2317 // Make sure we aren't watching a NetLog on destruction. Because the NetLog
18 // may pass events to each observer on multiple threads, we cannot safely
19 // stop watching a NetLog automatically from a parent class.
20 DCHECK(!net_log_);
[email protected]ae6e9912011-07-27 01:18:2821}
22
eroman001c3742015-04-23 03:11:1723NetLogCaptureMode NetLog::ThreadSafeObserver::capture_mode() const {
[email protected]d5cbd92a2012-02-29 12:43:2324 DCHECK(net_log_);
eroman001c3742015-04-23 03:11:1725 return capture_mode_;
[email protected]ae6e9912011-07-27 01:18:2826}
27
[email protected]d5cbd92a2012-02-29 12:43:2328NetLog* NetLog::ThreadSafeObserver::net_log() const {
29 return net_log_;
30}
31
Eric Roman06bd9742019-07-13 15:19:1332NetLog::NetLog() : last_id_(0), observer_capture_modes_(0) {}
[email protected]e7c6aaf2013-06-07 21:59:0733
Eric Roman2346c1c2019-07-15 22:22:0034NetLog::~NetLog() {
35 MarkDead();
36}
[email protected]e7c6aaf2013-06-07 21:59:0737
Eric Roman06bd9742019-07-13 15:19:1338void NetLog::AddEntry(NetLogEventType type,
39 const NetLogSource& source,
40 NetLogEventPhase phase) {
41 AddEntry(type, source, phase, [] { return base::Value(); });
[email protected]3abacd62012-06-10 20:20:3242}
43
Eric Roman06bd9742019-07-13 15:19:1344void NetLog::AddGlobalEntry(NetLogEventType type) {
mikecironef22f9812016-10-04 03:40:1945 AddEntry(type, NetLogSource(NetLogSourceType::NONE, NextID()),
Eric Roman06bd9742019-07-13 15:19:1346 NetLogEventPhase::NONE);
47}
48
49void NetLog::AddGlobalEntryWithStringParams(NetLogEventType type,
50 base::StringPiece name,
51 base::StringPiece value) {
52 AddGlobalEntry(type, [&] { return NetLogParamsWithString(name, value); });
[email protected]3abacd62012-06-10 20:20:3253}
54
Avi Drissman13fc8932015-12-20 04:40:4655uint32_t NetLog::NextID() {
[email protected]e7c6aaf2013-06-07 21:59:0756 return base::subtle::NoBarrier_AtomicIncrement(&last_id_, 1);
57}
58
eroman24bc6a12015-05-06 19:55:4859bool NetLog::IsCapturing() const {
Eric Roman2346c1c2019-07-15 22:22:0060 CheckAlive();
Eric Roman06bd9742019-07-13 15:19:1361 return GetObserverCaptureModes() != 0;
[email protected]e7c6aaf2013-06-07 21:59:0762}
63
Eric Roman68318e72017-07-19 02:12:1564void NetLog::AddObserver(NetLog::ThreadSafeObserver* observer,
65 NetLogCaptureMode capture_mode) {
[email protected]e7c6aaf2013-06-07 21:59:0766 base::AutoLock lock(lock_);
67
68 DCHECK(!observer->net_log_);
eromanf519e142016-11-30 21:30:4569 DCHECK(!HasObserver(observer));
70 DCHECK_LT(observers_.size(), 20u); // Performance sanity check.
71
72 observers_.push_back(observer);
73
[email protected]e7c6aaf2013-06-07 21:59:0774 observer->net_log_ = this;
eroman001c3742015-04-23 03:11:1775 observer->capture_mode_ = capture_mode;
Eric Roman06bd9742019-07-13 15:19:1376 UpdateObserverCaptureModes();
[email protected]e7c6aaf2013-06-07 21:59:0777}
78
Eric Roman68318e72017-07-19 02:12:1579void NetLog::RemoveObserver(NetLog::ThreadSafeObserver* observer) {
[email protected]e7c6aaf2013-06-07 21:59:0780 base::AutoLock lock(lock_);
81
[email protected]e7c6aaf2013-06-07 21:59:0782 DCHECK_EQ(this, observer->net_log_);
eromanf519e142016-11-30 21:30:4583
84 auto it = std::find(observers_.begin(), observers_.end(), observer);
85 DCHECK(it != observers_.end());
86 observers_.erase(it);
87
Raul Tambre94493c652019-03-11 17:18:3588 observer->net_log_ = nullptr;
Eric Roman3124cde2019-07-10 22:26:1589 observer->capture_mode_ = NetLogCaptureMode::kDefault;
Eric Roman06bd9742019-07-13 15:19:1390 UpdateObserverCaptureModes();
[email protected]e7c6aaf2013-06-07 21:59:0791}
92
Eric Roman06bd9742019-07-13 15:19:1393void NetLog::UpdateObserverCaptureModes() {
[email protected]e7c6aaf2013-06-07 21:59:0794 lock_.AssertAcquired();
Eric Roman06bd9742019-07-13 15:19:1395
96 NetLogCaptureModeSet capture_mode_set = 0;
97 for (const auto* observer : observers_)
98 NetLogCaptureModeSetAdd(observer->capture_mode_, &capture_mode_set);
99
100 base::subtle::NoBarrier_Store(&observer_capture_modes_, capture_mode_set);
eromanf519e142016-11-30 21:30:45101}
102
103bool NetLog::HasObserver(ThreadSafeObserver* observer) {
104 lock_.AssertAcquired();
Jan Wilken Dörrie21f9de72019-06-07 10:41:53105 return base::Contains(observers_, observer);
[email protected]e7c6aaf2013-06-07 21:59:07106}
107
[email protected]9e743cd2010-03-16 07:03:53108// static
[email protected]1ce7b66b2010-10-12 20:32:44109std::string NetLog::TickCountToString(const base::TimeTicks& time) {
Lily Chen2ad52fb2019-02-14 20:57:20110 int64_t delta_time = time.since_origin().InMilliseconds();
Eric Romanaefc98c2018-12-18 21:38:01111 // TODO(https://crbug.com/915391): Use NetLogNumberValue().
Raul Tambre8c1981dd2019-02-08 02:22:26112 return base::NumberToString(delta_time);
[email protected]1ce7b66b2010-10-12 20:32:44113}
114
115// static
Lily Chen2ad52fb2019-02-14 20:57:20116std::string NetLog::TimeToString(const base::Time& time) {
117 // Convert the base::Time to its (approximate) equivalent in base::TimeTicks.
118 base::TimeTicks time_ticks =
119 base::TimeTicks::UnixEpoch() + (time - base::Time::UnixEpoch());
120 return TickCountToString(time_ticks);
121}
122
123// static
mikecirone8b85c432016-09-08 19:11:00124const char* NetLog::EventTypeToString(NetLogEventType event) {
[email protected]9e743cd2010-03-16 07:03:53125 switch (event) {
mikecirone8b85c432016-09-08 19:11:00126#define EVENT_TYPE(label) \
127 case NetLogEventType::label: \
eroman87c53d62015-04-02 06:51:07128 return #label;
129#include "net/log/net_log_event_type_list.h"
[email protected]9e743cd2010-03-16 07:03:53130#undef EVENT_TYPE
[email protected]988394e2012-02-22 16:37:55131 default:
132 NOTREACHED();
Raul Tambre94493c652019-03-11 17:18:35133 return nullptr;
[email protected]9e743cd2010-03-16 07:03:53134 }
[email protected]9e743cd2010-03-16 07:03:53135}
136
[email protected]fd9c0d92010-03-23 17:47:49137// static
Eric Romanb0436912019-04-30 23:38:42138base::Value NetLog::GetEventTypesAsValue() {
139 base::DictionaryValue dict;
mikecirone8b85c432016-09-08 19:11:00140 for (int i = 0; i < static_cast<int>(NetLogEventType::COUNT); ++i) {
Eric Romanb0436912019-04-30 23:38:42141 dict.SetInteger(EventTypeToString(static_cast<NetLogEventType>(i)), i);
[email protected]988394e2012-02-22 16:37:55142 }
jdoerrie664305c2017-06-07 08:34:34143 return std::move(dict);
[email protected]fd9c0d92010-03-23 17:47:49144}
145
[email protected]93190352010-08-13 13:55:10146// static
mikecirone8b85c432016-09-08 19:11:00147const char* NetLog::SourceTypeToString(NetLogSourceType source) {
[email protected]93190352010-08-13 13:55:10148 switch (source) {
mikecirone8b85c432016-09-08 19:11:00149#define SOURCE_TYPE(label) \
150 case NetLogSourceType::label: \
eroman87c53d62015-04-02 06:51:07151 return #label;
152#include "net/log/net_log_source_type_list.h"
[email protected]93190352010-08-13 13:55:10153#undef SOURCE_TYPE
[email protected]988394e2012-02-22 16:37:55154 default:
155 NOTREACHED();
Raul Tambre94493c652019-03-11 17:18:35156 return nullptr;
[email protected]93190352010-08-13 13:55:10157 }
[email protected]988394e2012-02-22 16:37:55158}
159
160// static
Eric Romanb0436912019-04-30 23:38:42161base::Value NetLog::GetSourceTypesAsValue() {
162 base::DictionaryValue dict;
mikecirone8b85c432016-09-08 19:11:00163 for (int i = 0; i < static_cast<int>(NetLogSourceType::COUNT); ++i) {
Eric Romanb0436912019-04-30 23:38:42164 dict.SetInteger(SourceTypeToString(static_cast<NetLogSourceType>(i)), i);
[email protected]988394e2012-02-22 16:37:55165 }
jdoerrie664305c2017-06-07 08:34:34166 return std::move(dict);
[email protected]93190352010-08-13 13:55:10167}
168
169// static
mikecirone8b85c432016-09-08 19:11:00170const char* NetLog::EventPhaseToString(NetLogEventPhase phase) {
[email protected]93190352010-08-13 13:55:10171 switch (phase) {
mikecirone8b85c432016-09-08 19:11:00172 case NetLogEventPhase::BEGIN:
[email protected]93190352010-08-13 13:55:10173 return "PHASE_BEGIN";
mikecirone8b85c432016-09-08 19:11:00174 case NetLogEventPhase::END:
[email protected]93190352010-08-13 13:55:10175 return "PHASE_END";
mikecirone8b85c432016-09-08 19:11:00176 case NetLogEventPhase::NONE:
[email protected]93190352010-08-13 13:55:10177 return "PHASE_NONE";
178 }
179 NOTREACHED();
Raul Tambre94493c652019-03-11 17:18:35180 return nullptr;
[email protected]93190352010-08-13 13:55:10181}
182
Eric Roman06bd9742019-07-13 15:19:13183void NetLog::AddEntryInternal(NetLogEventType type,
184 const NetLogSource& source,
185 NetLogEventPhase phase,
186 const GetParamsInterface* get_params) {
187 NetLogCaptureModeSet observer_capture_modes = GetObserverCaptureModes();
188
189 for (int i = 0; i <= static_cast<int>(NetLogCaptureMode::kLast); ++i) {
190 NetLogCaptureMode capture_mode = static_cast<NetLogCaptureMode>(i);
191 if (!NetLogCaptureModeSetContains(capture_mode, observer_capture_modes))
192 continue;
193
194 NetLogEntry entry(type, source, phase, base::TimeTicks::Now(),
195 get_params->GetParams(capture_mode));
196
197 // Notify all of the log observers with |capture_mode|.
198 base::AutoLock lock(lock_);
199 for (auto* observer : observers_) {
200 if (observer->capture_mode() == capture_mode)
201 observer->OnAddEntry(entry);
202 }
203 }
mmenke04ffcf22015-04-24 17:08:46204}
205
Eric Roman06bd9742019-07-13 15:19:13206NetLogCaptureModeSet NetLog::GetObserverCaptureModes() const {
207 return base::subtle::NoBarrier_Load(&observer_capture_modes_);
[email protected]cd565142012-06-12 16:21:45208}
209
Eric Roman06bd9742019-07-13 15:19:13210void NetLog::AddEntryWithMaterializedParams(NetLogEventType type,
211 const NetLogSource& source,
212 NetLogEventPhase phase,
213 base::Value&& params) {
214 NetLogEntry entry(type, source, phase, base::TimeTicks::Now(),
215 std::move(params));
[email protected]2fa08912012-06-14 20:56:26216
Eric Roman06bd9742019-07-13 15:19:13217 // Notify all of the log observers with |capture_mode|.
[email protected]e7c6aaf2013-06-07 21:59:07218 base::AutoLock lock(lock_);
Eric Roman06bd9742019-07-13 15:19:13219 for (auto* observer : observers_) {
220 observer->OnAddEntry(entry);
221 }
[email protected]3abacd62012-06-10 20:20:32222}
223
[email protected]9e743cd2010-03-16 07:03:53224} // namespace net