| Index: chrome/browser/metrics/histogram_synchronizer.cc
|
| ===================================================================
|
| --- chrome/browser/metrics/histogram_synchronizer.cc (revision 64486)
|
| +++ chrome/browser/metrics/histogram_synchronizer.cc (working copy)
|
| @@ -22,11 +22,11 @@
|
| callback_task_(NULL),
|
| callback_thread_(NULL),
|
| io_message_loop_(NULL),
|
| - next_available_sequence_number_(0),
|
| - async_sequence_number_(0),
|
| + next_available_sequence_number_(-2),
|
| + async_sequence_number_(-2),
|
| async_renderers_pending_(0),
|
| async_callback_start_time_(TimeTicks::Now()),
|
| - synchronous_sequence_number_(0),
|
| + synchronous_sequence_number_(-2),
|
| synchronous_renderers_pending_(0) {
|
| DCHECK(histogram_synchronizer_ == NULL);
|
| histogram_synchronizer_ = this;
|
| @@ -57,14 +57,15 @@
|
| it.GetCurrentValue()->Send(
|
| new ViewMsg_GetRendererHistograms(sequence_number));
|
| }
|
| + // Send notification that we're done sending messages to renderers.
|
| + DecrementPendingRenderers(sequence_number);
|
|
|
| TimeTicks start = TimeTicks::Now();
|
| TimeTicks end_time = start + wait_time;
|
| int unresponsive_renderer_count;
|
| {
|
| AutoLock auto_lock(lock_);
|
| - while (synchronous_renderers_pending_ > 0 &&
|
| - TimeTicks::Now() < end_time) {
|
| + while (synchronous_renderers_pending_ > 0 && TimeTicks::Now() < end_time) {
|
| wait_time = end_time - TimeTicks::Now();
|
| received_all_renderer_histograms_.TimedWait(wait_time);
|
| }
|
| @@ -115,6 +116,8 @@
|
| it.GetCurrentValue()->Send(
|
| new ViewMsg_GetRendererHistograms(sequence_number));
|
| }
|
| + // Send notification that we're done sending messages to renderers.
|
| + current_synchronizer->DecrementPendingRenderers(sequence_number);
|
|
|
| // Post a task that would be called after waiting for wait_time.
|
| BrowserThread::PostDelayedTask(
|
| @@ -144,13 +147,12 @@
|
| }
|
|
|
| // Record that we have received a histogram from renderer process.
|
| - current_synchronizer->RecordRendererHistogram(sequence_number);
|
| + current_synchronizer->DecrementPendingRenderers(sequence_number);
|
| }
|
|
|
| -bool HistogramSynchronizer::RecordRendererHistogram(int sequence_number) {
|
| - DCHECK(IsOnIoThread());
|
| -
|
| +bool HistogramSynchronizer::DecrementPendingRenderers(int sequence_number) {
|
| if (sequence_number == async_sequence_number_) {
|
| + DCHECK(IsOnIoThread());
|
| if ((async_renderers_pending_ == 0) ||
|
| (--async_renderers_pending_ > 0))
|
| return false;
|
| @@ -248,22 +250,26 @@
|
| DCHECK_NE(next_available_sequence_number_,
|
| chrome::kHistogramSynchronizerReservedSequenceNumber);
|
| if (requester == ASYNC_HISTOGRAMS) {
|
| + DCHECK(IsOnIoThread());
|
| async_sequence_number_ = next_available_sequence_number_;
|
| - async_renderers_pending_ = 0;
|
| + async_renderers_pending_ = 1;
|
| } else if (requester == SYNCHRONOUS_HISTOGRAMS) {
|
| synchronous_sequence_number_ = next_available_sequence_number_;
|
| - synchronous_renderers_pending_ = 0;
|
| + synchronous_renderers_pending_ = 1;
|
| }
|
| return next_available_sequence_number_;
|
| }
|
|
|
| void HistogramSynchronizer::IncrementPendingRenderers(
|
| RendererHistogramRequester requester) {
|
| - AutoLock auto_lock(lock_);
|
| if (requester == ASYNC_HISTOGRAMS) {
|
| - async_renderers_pending_++;
|
| + DCHECK(IsOnIoThread());
|
| + DCHECK_GT(async_renderers_pending_, 0);
|
| + ++async_renderers_pending_;
|
| } else {
|
| - synchronous_renderers_pending_++;
|
| + AutoLock auto_lock(lock_);
|
| + DCHECK_GT(synchronous_renderers_pending_, 0);
|
| + ++synchronous_renderers_pending_;
|
| }
|
| }
|
|
|
|
|