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 "content/browser/histogram_synchronizer.h" | 5 #include "content/browser/histogram_synchronizer.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 HistogramSynchronizer* current_synchronizer = | 194 HistogramSynchronizer* current_synchronizer = |
195 HistogramSynchronizer::GetInstance(); | 195 HistogramSynchronizer::GetInstance(); |
196 if (current_synchronizer == NULL) | 196 if (current_synchronizer == NULL) |
197 return; | 197 return; |
198 | 198 |
199 current_synchronizer->RegisterAndNotifyAllProcesses( | 199 current_synchronizer->RegisterAndNotifyAllProcesses( |
200 HistogramSynchronizer::UNKNOWN, | 200 HistogramSynchronizer::UNKNOWN, |
201 base::TimeDelta::FromMinutes(1)); | 201 base::TimeDelta::FromMinutes(1)); |
202 } | 202 } |
203 | 203 |
204 void FetchHistogramsAsynchronously(MessageLoop* callback_thread, | 204 void FetchHistogramsAsynchronously(base::MessageLoop* callback_thread, |
205 const base::Closure& callback, | 205 const base::Closure& callback, |
206 base::TimeDelta wait_time) { | 206 base::TimeDelta wait_time) { |
207 HistogramSynchronizer::FetchHistogramsAsynchronously( | 207 HistogramSynchronizer::FetchHistogramsAsynchronously( |
208 callback_thread, callback, wait_time); | 208 callback_thread, callback, wait_time); |
209 } | 209 } |
210 | 210 |
211 // static | 211 // static |
212 void HistogramSynchronizer::FetchHistogramsAsynchronously( | 212 void HistogramSynchronizer::FetchHistogramsAsynchronously( |
213 MessageLoop* callback_thread, | 213 base::MessageLoop* callback_thread, |
214 const base::Closure& callback, | 214 const base::Closure& callback, |
215 base::TimeDelta wait_time) { | 215 base::TimeDelta wait_time) { |
216 DCHECK(callback_thread != NULL); | 216 DCHECK(callback_thread != NULL); |
217 DCHECK(!callback.is_null()); | 217 DCHECK(!callback.is_null()); |
218 | 218 |
219 HistogramSynchronizer* current_synchronizer = | 219 HistogramSynchronizer* current_synchronizer = |
220 HistogramSynchronizer::GetInstance(); | 220 HistogramSynchronizer::GetInstance(); |
221 current_synchronizer->SetCallbackTaskAndThread( | 221 current_synchronizer->SetCallbackTaskAndThread( |
222 callback_thread, callback); | 222 callback_thread, callback); |
223 | 223 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 | 280 |
281 if (!request) | 281 if (!request) |
282 return; | 282 return; |
283 | 283 |
284 // Delete request if we have heard back from all child processes. | 284 // Delete request if we have heard back from all child processes. |
285 request->DecrementProcessesPending(); | 285 request->DecrementProcessesPending(); |
286 request->DeleteIfAllDone(); | 286 request->DeleteIfAllDone(); |
287 } | 287 } |
288 | 288 |
289 void HistogramSynchronizer::SetCallbackTaskAndThread( | 289 void HistogramSynchronizer::SetCallbackTaskAndThread( |
290 MessageLoop* callback_thread, | 290 base::MessageLoop* callback_thread, |
291 const base::Closure& callback) { | 291 const base::Closure& callback) { |
292 base::Closure old_callback; | 292 base::Closure old_callback; |
293 MessageLoop* old_thread = NULL; | 293 base::MessageLoop* old_thread = NULL; |
294 { | 294 { |
295 base::AutoLock auto_lock(lock_); | 295 base::AutoLock auto_lock(lock_); |
296 old_callback = callback_; | 296 old_callback = callback_; |
297 callback_ = callback; | 297 callback_ = callback; |
298 old_thread = callback_thread_; | 298 old_thread = callback_thread_; |
299 callback_thread_ = callback_thread; | 299 callback_thread_ = callback_thread; |
300 // Prevent premature calling of our new callbacks. | 300 // Prevent premature calling of our new callbacks. |
301 async_sequence_number_ = kNeverUsableSequenceNumber; | 301 async_sequence_number_ = kNeverUsableSequenceNumber; |
302 } | 302 } |
303 // Just in case there was a task pending.... | 303 // Just in case there was a task pending.... |
304 InternalPostTask(old_thread, old_callback); | 304 InternalPostTask(old_thread, old_callback); |
305 } | 305 } |
306 | 306 |
307 void HistogramSynchronizer::ForceHistogramSynchronizationDoneCallback( | 307 void HistogramSynchronizer::ForceHistogramSynchronizationDoneCallback( |
308 int sequence_number) { | 308 int sequence_number) { |
309 base::Closure callback; | 309 base::Closure callback; |
310 MessageLoop* thread = NULL; | 310 base::MessageLoop* thread = NULL; |
311 { | 311 { |
312 base::AutoLock lock(lock_); | 312 base::AutoLock lock(lock_); |
313 if (sequence_number != async_sequence_number_) | 313 if (sequence_number != async_sequence_number_) |
314 return; | 314 return; |
315 callback = callback_; | 315 callback = callback_; |
316 thread = callback_thread_; | 316 thread = callback_thread_; |
317 callback_.Reset(); | 317 callback_.Reset(); |
318 callback_thread_ = NULL; | 318 callback_thread_ = NULL; |
319 } | 319 } |
320 InternalPostTask(thread, callback); | 320 InternalPostTask(thread, callback); |
321 } | 321 } |
322 | 322 |
323 void HistogramSynchronizer::InternalPostTask(MessageLoop* thread, | 323 void HistogramSynchronizer::InternalPostTask(base::MessageLoop* thread, |
324 const base::Closure& callback) { | 324 const base::Closure& callback) { |
325 if (callback.is_null() || !thread) | 325 if (callback.is_null() || !thread) |
326 return; | 326 return; |
327 thread->PostTask(FROM_HERE, callback); | 327 thread->PostTask(FROM_HERE, callback); |
328 } | 328 } |
329 | 329 |
330 int HistogramSynchronizer::GetNextAvailableSequenceNumber( | 330 int HistogramSynchronizer::GetNextAvailableSequenceNumber( |
331 ProcessHistogramRequester requester) { | 331 ProcessHistogramRequester requester) { |
332 base::AutoLock auto_lock(lock_); | 332 base::AutoLock auto_lock(lock_); |
333 ++last_used_sequence_number_; | 333 ++last_used_sequence_number_; |
334 // Watch out for wrapping to a negative number. | 334 // Watch out for wrapping to a negative number. |
335 if (last_used_sequence_number_ < 0) { | 335 if (last_used_sequence_number_ < 0) { |
336 // Bypass the reserved number, which is used when a renderer spontaneously | 336 // Bypass the reserved number, which is used when a renderer spontaneously |
337 // decides to send some histogram data. | 337 // decides to send some histogram data. |
338 last_used_sequence_number_ = | 338 last_used_sequence_number_ = |
339 kHistogramSynchronizerReservedSequenceNumber + 1; | 339 kHistogramSynchronizerReservedSequenceNumber + 1; |
340 } | 340 } |
341 DCHECK_NE(last_used_sequence_number_, | 341 DCHECK_NE(last_used_sequence_number_, |
342 kHistogramSynchronizerReservedSequenceNumber); | 342 kHistogramSynchronizerReservedSequenceNumber); |
343 if (requester == ASYNC_HISTOGRAMS) | 343 if (requester == ASYNC_HISTOGRAMS) |
344 async_sequence_number_ = last_used_sequence_number_; | 344 async_sequence_number_ = last_used_sequence_number_; |
345 return last_used_sequence_number_; | 345 return last_used_sequence_number_; |
346 } | 346 } |
347 | 347 |
348 } // namespace content | 348 } // namespace content |
OLD | NEW |