[email protected] | 988394e | 2012-02-22 16:37:55 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 9e743cd | 2010-03-16 07:03:53 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
eroman | 87c53d6 | 2015-04-02 06:51:07 | [diff] [blame] | 5 | #include "net/log/net_log.h" |
[email protected] | f6f1bebc | 2011-01-07 03:04:54 | [diff] [blame] | 6 | |
[email protected] | 4b35521 | 2013-06-11 10:35:19 | [diff] [blame] | 7 | #include "base/strings/string_number_conversions.h" |
[email protected] | d13f51b | 2010-04-27 23:20:45 | [diff] [blame] | 8 | #include "base/values.h" |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 9 | #include "net/log/net_log_values.h" |
[email protected] | 9e743cd | 2010-03-16 07:03:53 | [diff] [blame] | 10 | |
| 11 | namespace net { |
| 12 | |
Eric Roman | 3124cde | 2019-07-10 22:26:15 | [diff] [blame] | 13 | NetLog::ThreadSafeObserver::ThreadSafeObserver() |
| 14 | : capture_mode_(NetLogCaptureMode::kDefault), net_log_(nullptr) {} |
[email protected] | ae6e991 | 2011-07-27 01:18:28 | [diff] [blame] | 15 | |
| 16 | NetLog::ThreadSafeObserver::~ThreadSafeObserver() { |
[email protected] | d5cbd92a | 2012-02-29 12:43:23 | [diff] [blame] | 17 | // 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] | ae6e991 | 2011-07-27 01:18:28 | [diff] [blame] | 21 | } |
| 22 | |
eroman | 001c374 | 2015-04-23 03:11:17 | [diff] [blame] | 23 | NetLogCaptureMode NetLog::ThreadSafeObserver::capture_mode() const { |
[email protected] | d5cbd92a | 2012-02-29 12:43:23 | [diff] [blame] | 24 | DCHECK(net_log_); |
eroman | 001c374 | 2015-04-23 03:11:17 | [diff] [blame] | 25 | return capture_mode_; |
[email protected] | ae6e991 | 2011-07-27 01:18:28 | [diff] [blame] | 26 | } |
| 27 | |
[email protected] | d5cbd92a | 2012-02-29 12:43:23 | [diff] [blame] | 28 | NetLog* NetLog::ThreadSafeObserver::net_log() const { |
| 29 | return net_log_; |
| 30 | } |
| 31 | |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 32 | NetLog::NetLog() : last_id_(0), observer_capture_modes_(0) {} |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 33 | |
Eric Roman | 2346c1c | 2019-07-15 22:22:00 | [diff] [blame] | 34 | NetLog::~NetLog() { |
| 35 | MarkDead(); |
| 36 | } |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 37 | |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 38 | void NetLog::AddEntry(NetLogEventType type, |
| 39 | const NetLogSource& source, |
| 40 | NetLogEventPhase phase) { |
| 41 | AddEntry(type, source, phase, [] { return base::Value(); }); |
[email protected] | 3abacd6 | 2012-06-10 20:20:32 | [diff] [blame] | 42 | } |
| 43 | |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 44 | void NetLog::AddGlobalEntry(NetLogEventType type) { |
mikecirone | f22f981 | 2016-10-04 03:40:19 | [diff] [blame] | 45 | AddEntry(type, NetLogSource(NetLogSourceType::NONE, NextID()), |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 46 | NetLogEventPhase::NONE); |
| 47 | } |
| 48 | |
| 49 | void NetLog::AddGlobalEntryWithStringParams(NetLogEventType type, |
| 50 | base::StringPiece name, |
| 51 | base::StringPiece value) { |
| 52 | AddGlobalEntry(type, [&] { return NetLogParamsWithString(name, value); }); |
[email protected] | 3abacd6 | 2012-06-10 20:20:32 | [diff] [blame] | 53 | } |
| 54 | |
Avi Drissman | 13fc893 | 2015-12-20 04:40:46 | [diff] [blame] | 55 | uint32_t NetLog::NextID() { |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 56 | return base::subtle::NoBarrier_AtomicIncrement(&last_id_, 1); |
| 57 | } |
| 58 | |
eroman | 24bc6a1 | 2015-05-06 19:55:48 | [diff] [blame] | 59 | bool NetLog::IsCapturing() const { |
Eric Roman | 2346c1c | 2019-07-15 22:22:00 | [diff] [blame] | 60 | CheckAlive(); |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 61 | return GetObserverCaptureModes() != 0; |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 62 | } |
| 63 | |
Eric Roman | 68318e7 | 2017-07-19 02:12:15 | [diff] [blame] | 64 | void NetLog::AddObserver(NetLog::ThreadSafeObserver* observer, |
| 65 | NetLogCaptureMode capture_mode) { |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 66 | base::AutoLock lock(lock_); |
| 67 | |
| 68 | DCHECK(!observer->net_log_); |
eroman | f519e14 | 2016-11-30 21:30:45 | [diff] [blame] | 69 | DCHECK(!HasObserver(observer)); |
| 70 | DCHECK_LT(observers_.size(), 20u); // Performance sanity check. |
| 71 | |
| 72 | observers_.push_back(observer); |
| 73 | |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 74 | observer->net_log_ = this; |
eroman | 001c374 | 2015-04-23 03:11:17 | [diff] [blame] | 75 | observer->capture_mode_ = capture_mode; |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 76 | UpdateObserverCaptureModes(); |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 77 | } |
| 78 | |
Eric Roman | 68318e7 | 2017-07-19 02:12:15 | [diff] [blame] | 79 | void NetLog::RemoveObserver(NetLog::ThreadSafeObserver* observer) { |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 80 | base::AutoLock lock(lock_); |
| 81 | |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 82 | DCHECK_EQ(this, observer->net_log_); |
eroman | f519e14 | 2016-11-30 21:30:45 | [diff] [blame] | 83 | |
| 84 | auto it = std::find(observers_.begin(), observers_.end(), observer); |
| 85 | DCHECK(it != observers_.end()); |
| 86 | observers_.erase(it); |
| 87 | |
Raul Tambre | 94493c65 | 2019-03-11 17:18:35 | [diff] [blame] | 88 | observer->net_log_ = nullptr; |
Eric Roman | 3124cde | 2019-07-10 22:26:15 | [diff] [blame] | 89 | observer->capture_mode_ = NetLogCaptureMode::kDefault; |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 90 | UpdateObserverCaptureModes(); |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 91 | } |
| 92 | |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 93 | void NetLog::UpdateObserverCaptureModes() { |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 94 | lock_.AssertAcquired(); |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 95 | |
| 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); |
eroman | f519e14 | 2016-11-30 21:30:45 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | bool NetLog::HasObserver(ThreadSafeObserver* observer) { |
| 104 | lock_.AssertAcquired(); |
Jan Wilken Dörrie | 21f9de7 | 2019-06-07 10:41:53 | [diff] [blame] | 105 | return base::Contains(observers_, observer); |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 106 | } |
| 107 | |
[email protected] | 9e743cd | 2010-03-16 07:03:53 | [diff] [blame] | 108 | // static |
[email protected] | 1ce7b66b | 2010-10-12 20:32:44 | [diff] [blame] | 109 | std::string NetLog::TickCountToString(const base::TimeTicks& time) { |
Lily Chen | 2ad52fb | 2019-02-14 20:57:20 | [diff] [blame] | 110 | int64_t delta_time = time.since_origin().InMilliseconds(); |
Eric Roman | aefc98c | 2018-12-18 21:38:01 | [diff] [blame] | 111 | // TODO(https://crbug.com/915391): Use NetLogNumberValue(). |
Raul Tambre | 8c1981dd | 2019-02-08 02:22:26 | [diff] [blame] | 112 | return base::NumberToString(delta_time); |
[email protected] | 1ce7b66b | 2010-10-12 20:32:44 | [diff] [blame] | 113 | } |
| 114 | |
| 115 | // static |
Lily Chen | 2ad52fb | 2019-02-14 20:57:20 | [diff] [blame] | 116 | std::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 |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 124 | const char* NetLog::EventTypeToString(NetLogEventType event) { |
[email protected] | 9e743cd | 2010-03-16 07:03:53 | [diff] [blame] | 125 | switch (event) { |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 126 | #define EVENT_TYPE(label) \ |
| 127 | case NetLogEventType::label: \ |
eroman | 87c53d6 | 2015-04-02 06:51:07 | [diff] [blame] | 128 | return #label; |
| 129 | #include "net/log/net_log_event_type_list.h" |
[email protected] | 9e743cd | 2010-03-16 07:03:53 | [diff] [blame] | 130 | #undef EVENT_TYPE |
[email protected] | 988394e | 2012-02-22 16:37:55 | [diff] [blame] | 131 | default: |
| 132 | NOTREACHED(); |
Raul Tambre | 94493c65 | 2019-03-11 17:18:35 | [diff] [blame] | 133 | return nullptr; |
[email protected] | 9e743cd | 2010-03-16 07:03:53 | [diff] [blame] | 134 | } |
[email protected] | 9e743cd | 2010-03-16 07:03:53 | [diff] [blame] | 135 | } |
| 136 | |
[email protected] | fd9c0d9 | 2010-03-23 17:47:49 | [diff] [blame] | 137 | // static |
Eric Roman | b043691 | 2019-04-30 23:38:42 | [diff] [blame] | 138 | base::Value NetLog::GetEventTypesAsValue() { |
| 139 | base::DictionaryValue dict; |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 140 | for (int i = 0; i < static_cast<int>(NetLogEventType::COUNT); ++i) { |
Eric Roman | b043691 | 2019-04-30 23:38:42 | [diff] [blame] | 141 | dict.SetInteger(EventTypeToString(static_cast<NetLogEventType>(i)), i); |
[email protected] | 988394e | 2012-02-22 16:37:55 | [diff] [blame] | 142 | } |
jdoerrie | 664305c | 2017-06-07 08:34:34 | [diff] [blame] | 143 | return std::move(dict); |
[email protected] | fd9c0d9 | 2010-03-23 17:47:49 | [diff] [blame] | 144 | } |
| 145 | |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 146 | // static |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 147 | const char* NetLog::SourceTypeToString(NetLogSourceType source) { |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 148 | switch (source) { |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 149 | #define SOURCE_TYPE(label) \ |
| 150 | case NetLogSourceType::label: \ |
eroman | 87c53d6 | 2015-04-02 06:51:07 | [diff] [blame] | 151 | return #label; |
| 152 | #include "net/log/net_log_source_type_list.h" |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 153 | #undef SOURCE_TYPE |
[email protected] | 988394e | 2012-02-22 16:37:55 | [diff] [blame] | 154 | default: |
| 155 | NOTREACHED(); |
Raul Tambre | 94493c65 | 2019-03-11 17:18:35 | [diff] [blame] | 156 | return nullptr; |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 157 | } |
[email protected] | 988394e | 2012-02-22 16:37:55 | [diff] [blame] | 158 | } |
| 159 | |
| 160 | // static |
Eric Roman | b043691 | 2019-04-30 23:38:42 | [diff] [blame] | 161 | base::Value NetLog::GetSourceTypesAsValue() { |
| 162 | base::DictionaryValue dict; |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 163 | for (int i = 0; i < static_cast<int>(NetLogSourceType::COUNT); ++i) { |
Eric Roman | b043691 | 2019-04-30 23:38:42 | [diff] [blame] | 164 | dict.SetInteger(SourceTypeToString(static_cast<NetLogSourceType>(i)), i); |
[email protected] | 988394e | 2012-02-22 16:37:55 | [diff] [blame] | 165 | } |
jdoerrie | 664305c | 2017-06-07 08:34:34 | [diff] [blame] | 166 | return std::move(dict); |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 167 | } |
| 168 | |
| 169 | // static |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 170 | const char* NetLog::EventPhaseToString(NetLogEventPhase phase) { |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 171 | switch (phase) { |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 172 | case NetLogEventPhase::BEGIN: |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 173 | return "PHASE_BEGIN"; |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 174 | case NetLogEventPhase::END: |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 175 | return "PHASE_END"; |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 176 | case NetLogEventPhase::NONE: |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 177 | return "PHASE_NONE"; |
| 178 | } |
| 179 | NOTREACHED(); |
Raul Tambre | 94493c65 | 2019-03-11 17:18:35 | [diff] [blame] | 180 | return nullptr; |
[email protected] | 9319035 | 2010-08-13 13:55:10 | [diff] [blame] | 181 | } |
| 182 | |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 183 | void 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 | } |
mmenke | 04ffcf2 | 2015-04-24 17:08:46 | [diff] [blame] | 204 | } |
| 205 | |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 206 | NetLogCaptureModeSet NetLog::GetObserverCaptureModes() const { |
| 207 | return base::subtle::NoBarrier_Load(&observer_capture_modes_); |
[email protected] | cd56514 | 2012-06-12 16:21:45 | [diff] [blame] | 208 | } |
| 209 | |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 210 | void 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] | 2fa0891 | 2012-06-14 20:56:26 | [diff] [blame] | 216 | |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 217 | // Notify all of the log observers with |capture_mode|. |
[email protected] | e7c6aaf | 2013-06-07 21:59:07 | [diff] [blame] | 218 | base::AutoLock lock(lock_); |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 219 | for (auto* observer : observers_) { |
| 220 | observer->OnAddEntry(entry); |
| 221 | } |
[email protected] | 3abacd6 | 2012-06-10 20:20:32 | [diff] [blame] | 222 | } |
| 223 | |
[email protected] | 9e743cd | 2010-03-16 07:03:53 | [diff] [blame] | 224 | } // namespace net |