Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: chrome/browser/net/load_timing_observer.cc

Issue 4118004: Update NetLog to be thread safe. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Response to comments (And net-internals refresh fix) Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "chrome/browser/net/load_timing_observer.h" 5 #include "chrome/browser/net/load_timing_observer.h"
6 6
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/time.h" 8 #include "base/time.h"
9 #include "chrome/browser/net/chrome_net_log.h" 9 #include "chrome/browser/net/chrome_net_log.h"
10 #include "chrome/common/resource_response.h" 10 #include "chrome/common/resource_response.h"
(...skipping 26 matching lines...) Expand all
37 tick_to_time_offset); 37 tick_to_time_offset);
38 } 38 }
39 39
40 static int32 TimeTicksToOffset( 40 static int32 TimeTicksToOffset(
41 const TimeTicks& time_ticks, 41 const TimeTicks& time_ticks,
42 LoadTimingObserver::URLRequestRecord* record) { 42 LoadTimingObserver::URLRequestRecord* record) {
43 return static_cast<int32>( 43 return static_cast<int32>(
44 (time_ticks - record->base_ticks).InMillisecondsRoundedUp()); 44 (time_ticks - record->base_ticks).InMillisecondsRoundedUp());
45 } 45 }
46 46
47 } 47 } // namespace
48 48
49 LoadTimingObserver::URLRequestRecord::URLRequestRecord() 49 LoadTimingObserver::URLRequestRecord::URLRequestRecord()
50 : connect_job_id(net::NetLog::Source::kInvalidId), 50 : connect_job_id(net::NetLog::Source::kInvalidId),
51 socket_log_id(net::NetLog::Source::kInvalidId), 51 socket_log_id(net::NetLog::Source::kInvalidId),
52 socket_reused(false) { 52 socket_reused(false) {
53 } 53 }
54 54
55 LoadTimingObserver::LoadTimingObserver() 55 LoadTimingObserver::LoadTimingObserver()
56 : Observer(net::NetLog::LOG_BASIC), 56 : ThreadSafeObserver(net::NetLog::LOG_BASIC),
57 last_connect_job_id_(net::NetLog::Source::kInvalidId) { 57 last_connect_job_id_(net::NetLog::Source::kInvalidId) {
58 } 58 }
59 59
60 LoadTimingObserver::~LoadTimingObserver() { 60 LoadTimingObserver::~LoadTimingObserver() {
61 } 61 }
62 62
63 LoadTimingObserver::URLRequestRecord* 63 LoadTimingObserver::URLRequestRecord*
64 LoadTimingObserver::GetURLRequestRecord(uint32 source_id) { 64 LoadTimingObserver::GetURLRequestRecord(uint32 source_id) {
65 URLRequestToRecordMap::iterator it = url_request_to_record_.find(source_id); 65 URLRequestToRecordMap::iterator it = url_request_to_record_.find(source_id);
66 if (it != url_request_to_record_.end()) 66 if (it != url_request_to_record_.end())
67 return &it->second; 67 return &it->second;
68 return NULL; 68 return NULL;
69 } 69 }
70 70
71 void LoadTimingObserver::OnAddEntry(net::NetLog::EventType type, 71 void LoadTimingObserver::OnAddEntry(net::NetLog::EventType type,
72 const base::TimeTicks& time, 72 const base::TimeTicks& time,
73 const net::NetLog::Source& source, 73 const net::NetLog::Source& source,
74 net::NetLog::EventPhase phase, 74 net::NetLog::EventPhase phase,
75 net::NetLog::EventParameters* params) { 75 net::NetLog::EventParameters* params) {
76 // The events that the Observer is interested in only occur on the IO thread.
77 if (!BrowserThread::CurrentlyOn(BrowserThread::IO))
78 return;
76 if (source.type == net::NetLog::SOURCE_URL_REQUEST) 79 if (source.type == net::NetLog::SOURCE_URL_REQUEST)
77 OnAddURLRequestEntry(type, time, source, phase, params); 80 OnAddURLRequestEntry(type, time, source, phase, params);
78 else if (source.type == net::NetLog::SOURCE_CONNECT_JOB) 81 else if (source.type == net::NetLog::SOURCE_CONNECT_JOB)
79 OnAddConnectJobEntry(type, time, source, phase, params); 82 OnAddConnectJobEntry(type, time, source, phase, params);
80 else if (source.type == net::NetLog::SOURCE_SOCKET) 83 else if (source.type == net::NetLog::SOURCE_SOCKET)
81 OnAddSocketEntry(type, time, source, phase, params); 84 OnAddSocketEntry(type, time, source, phase, params);
82 } 85 }
83 86
84 // static 87 // static
85 void LoadTimingObserver::PopulateTimingInfo(URLRequest* request, 88 void LoadTimingObserver::PopulateTimingInfo(URLRequest* request,
86 ResourceResponse* response) { 89 ResourceResponse* response) {
90 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
87 if (!(request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING)) 91 if (!(request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING))
88 return; 92 return;
89 93
90 ChromeNetLog* chrome_net_log = static_cast<ChromeNetLog*>( 94 ChromeNetLog* chrome_net_log = static_cast<ChromeNetLog*>(
91 request->net_log().net_log()); 95 request->net_log().net_log());
92 if (chrome_net_log == NULL) 96 if (chrome_net_log == NULL)
93 return; 97 return;
94 98
95 uint32 source_id = request->net_log().source().id; 99 uint32 source_id = request->net_log().source().id;
96 LoadTimingObserver* observer = chrome_net_log->load_timing_observer(); 100 LoadTimingObserver* observer = chrome_net_log->load_timing_observer();
97 LoadTimingObserver::URLRequestRecord* record = 101 LoadTimingObserver::URLRequestRecord* record =
98 observer->GetURLRequestRecord(source_id); 102 observer->GetURLRequestRecord(source_id);
99 if (record) { 103 if (record) {
100 response->response_head.connection_id = record->socket_log_id; 104 response->response_head.connection_id = record->socket_log_id;
101 response->response_head.connection_reused = record->socket_reused; 105 response->response_head.connection_reused = record->socket_reused;
102 response->response_head.load_timing = record->timing; 106 response->response_head.load_timing = record->timing;
103 } 107 }
104 } 108 }
105 109
106 void LoadTimingObserver::OnAddURLRequestEntry( 110 void LoadTimingObserver::OnAddURLRequestEntry(
107 net::NetLog::EventType type, 111 net::NetLog::EventType type,
108 const base::TimeTicks& time, 112 const base::TimeTicks& time,
109 const net::NetLog::Source& source, 113 const net::NetLog::Source& source,
110 net::NetLog::EventPhase phase, 114 net::NetLog::EventPhase phase,
111 net::NetLog::EventParameters* params) { 115 net::NetLog::EventParameters* params) {
116 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
117
112 bool is_begin = phase == net::NetLog::PHASE_BEGIN; 118 bool is_begin = phase == net::NetLog::PHASE_BEGIN;
113 bool is_end = phase == net::NetLog::PHASE_END; 119 bool is_end = phase == net::NetLog::PHASE_END;
114 120
115 if (type == net::NetLog::TYPE_URL_REQUEST_START_JOB) { 121 if (type == net::NetLog::TYPE_URL_REQUEST_START_JOB) {
116 if (is_begin) { 122 if (is_begin) {
117 // Only record timing for entries with corresponding flag. 123 // Only record timing for entries with corresponding flag.
118 int load_flags = static_cast<URLRequestStartEventParameters*>(params)-> 124 int load_flags = static_cast<URLRequestStartEventParameters*>(params)->
119 load_flags(); 125 load_flags();
120 if (!(load_flags & net::LOAD_ENABLE_LOAD_TIMING)) 126 if (!(load_flags & net::LOAD_ENABLE_LOAD_TIMING))
121 return; 127 return;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 break; 209 break;
204 } 210 }
205 } 211 }
206 212
207 void LoadTimingObserver::OnAddConnectJobEntry( 213 void LoadTimingObserver::OnAddConnectJobEntry(
208 net::NetLog::EventType type, 214 net::NetLog::EventType type,
209 const base::TimeTicks& time, 215 const base::TimeTicks& time,
210 const net::NetLog::Source& source, 216 const net::NetLog::Source& source,
211 net::NetLog::EventPhase phase, 217 net::NetLog::EventPhase phase,
212 net::NetLog::EventParameters* params) { 218 net::NetLog::EventParameters* params) {
219 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
220
213 bool is_begin = phase == net::NetLog::PHASE_BEGIN; 221 bool is_begin = phase == net::NetLog::PHASE_BEGIN;
214 bool is_end = phase == net::NetLog::PHASE_END; 222 bool is_end = phase == net::NetLog::PHASE_END;
215 223
216 // Manage record lifetime based on the SOCKET_POOL_CONNECT_JOB entry. 224 // Manage record lifetime based on the SOCKET_POOL_CONNECT_JOB entry.
217 if (type == net::NetLog::TYPE_SOCKET_POOL_CONNECT_JOB) { 225 if (type == net::NetLog::TYPE_SOCKET_POOL_CONNECT_JOB) {
218 if (is_begin) { 226 if (is_begin) {
219 // Prevents us from passively growing the memory memory unbounded in case 227 // Prevents us from passively growing the memory memory unbounded in case
220 // something went wrong. Should not happen. 228 // something went wrong. Should not happen.
221 if (connect_job_to_record_.size() > kMaxNumEntries) { 229 if (connect_job_to_record_.size() > kMaxNumEntries) {
222 LOG(WARNING) << "The load timing observer connect job count has grown " 230 LOG(WARNING) << "The load timing observer connect job count has grown "
(...skipping 23 matching lines...) Expand all
246 } 254 }
247 } 255 }
248 } 256 }
249 257
250 void LoadTimingObserver::OnAddSocketEntry( 258 void LoadTimingObserver::OnAddSocketEntry(
251 net::NetLog::EventType type, 259 net::NetLog::EventType type,
252 const base::TimeTicks& time, 260 const base::TimeTicks& time,
253 const net::NetLog::Source& source, 261 const net::NetLog::Source& source,
254 net::NetLog::EventPhase phase, 262 net::NetLog::EventPhase phase,
255 net::NetLog::EventParameters* params) { 263 net::NetLog::EventParameters* params) {
264 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
265
256 bool is_begin = phase == net::NetLog::PHASE_BEGIN; 266 bool is_begin = phase == net::NetLog::PHASE_BEGIN;
257 bool is_end = phase == net::NetLog::PHASE_END; 267 bool is_end = phase == net::NetLog::PHASE_END;
258 268
259 // Manage record lifetime based on the SOCKET_ALIVE entry. 269 // Manage record lifetime based on the SOCKET_ALIVE entry.
260 if (type == net::NetLog::TYPE_SOCKET_ALIVE) { 270 if (type == net::NetLog::TYPE_SOCKET_ALIVE) {
261 if (is_begin) { 271 if (is_begin) {
262 // Prevents us from passively growing the memory memory unbounded in case 272 // Prevents us from passively growing the memory memory unbounded in case
263 // something went wrong. Should not happen. 273 // something went wrong. Should not happen.
264 if (socket_to_record_.size() > kMaxNumEntries) { 274 if (socket_to_record_.size() > kMaxNumEntries) {
265 LOG(WARNING) << "The load timing observer socket count has grown " 275 LOG(WARNING) << "The load timing observer socket count has grown "
(...skipping 12 matching lines...) Expand all
278 if (it == socket_to_record_.end()) 288 if (it == socket_to_record_.end())
279 return; 289 return;
280 290
281 if (type == net::NetLog::TYPE_SSL_CONNECT) { 291 if (type == net::NetLog::TYPE_SSL_CONNECT) {
282 if (is_begin) 292 if (is_begin)
283 it->second.ssl_start = time; 293 it->second.ssl_start = time;
284 else if (is_end) 294 else if (is_end)
285 it->second.ssl_end = time; 295 it->second.ssl_end = time;
286 } 296 }
287 } 297 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698