diff options
author | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-25 06:10:17 +0000 |
---|---|---|
committer | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-25 06:10:17 +0000 |
commit | 55e57d4d2326bd98d6e14c92ba055754ef77b0e6 (patch) | |
tree | 29f456dcb43fd5754104fe4e302df13532262c83 /chrome/renderer/renderer_histogram_snapshots.cc | |
parent | f78d965fa1ef193595740604508d7d94fde0ef84 (diff) | |
download | chromium_src-55e57d4d2326bd98d6e14c92ba055754ef77b0e6.zip chromium_src-55e57d4d2326bd98d6e14c92ba055754ef77b0e6.tar.gz chromium_src-55e57d4d2326bd98d6e14c92ba055754ef77b0e6.tar.bz2 |
Initial support for Renderer Side Histograms
Patch contributed by Raman Tenneti
see also patch number 21038
Review URL: http://codereview.chromium.org/27034
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10330 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/renderer_histogram_snapshots.cc')
-rw-r--r-- | chrome/renderer/renderer_histogram_snapshots.cc | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/chrome/renderer/renderer_histogram_snapshots.cc b/chrome/renderer/renderer_histogram_snapshots.cc new file mode 100644 index 0000000..a4488ca --- /dev/null +++ b/chrome/renderer/renderer_histogram_snapshots.cc @@ -0,0 +1,94 @@ +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/renderer/renderer_histogram_snapshots.h" + +#include <ctype.h> + +#include "base/histogram.h" +#include "base/logging.h" +#include "base/message_loop.h" +#include "base/pickle.h" +#include "chrome/common/render_messages.h" +#include "chrome/renderer/render_process.h" +#include "chrome/renderer/render_thread.h" + +// TODO(raman): Before renderer shuts down send final snapshot lists. + +RendererHistogramSnapshots::RendererHistogramSnapshots() + : ALLOW_THIS_IN_INITIALIZER_LIST( + renderer_histogram_snapshots_factory_(this)) { +} + +// Send data quickly! +void RendererHistogramSnapshots::SendHistograms() { + RenderThread::current()->message_loop()->PostTask(FROM_HERE, + renderer_histogram_snapshots_factory_.NewRunnableMethod( + &RendererHistogramSnapshots::UploadAllHistrograms)); +} + +void RendererHistogramSnapshots::UploadAllHistrograms() { + StatisticsRecorder::Histograms histograms; + StatisticsRecorder::GetHistograms(&histograms); + + HistogramPickledList pickled_histograms; + + for (StatisticsRecorder::Histograms::iterator it = histograms.begin(); + histograms.end() != it; + it++) { + UploadHistrogram(**it, &pickled_histograms); + } + // Send the handle over synchronous IPC. + if (pickled_histograms.size() > 0) { + RenderThread::current()->Send( + new ViewHostMsg_RendererHistograms(pickled_histograms)); + } +} + +// Extract snapshot data and then send it off the the Browser process +// to save it. +void RendererHistogramSnapshots::UploadHistrogram( + const Histogram& histogram, + HistogramPickledList* pickled_histograms) { + + // Get up-to-date snapshot of sample stats. + Histogram::SampleSet snapshot; + histogram.SnapshotSample(&snapshot); + const std::string& histogram_name = histogram.histogram_name(); + + // Find the already sent stats, or create an empty set. + LoggedSampleMap::iterator it = logged_samples_.find(histogram_name); + Histogram::SampleSet* already_logged; + if (logged_samples_.end() == it) { + // Add new entry. + already_logged = &logged_samples_[histogram.histogram_name()]; + already_logged->Resize(histogram); // Complete initialization. + } else { + already_logged = &(it->second); + // Deduct any stats we've already logged from our snapshot. + snapshot.Subtract(*already_logged); + } + + // Snapshot now contains only a delta to what we've already_logged. + + if (snapshot.TotalCount() > 0) { + UploadHistogramDelta(histogram, snapshot, pickled_histograms); + // Add new data into our running total. + already_logged->Add(snapshot); + } +} + +void RendererHistogramSnapshots::UploadHistogramDelta( + const Histogram& histogram, + const Histogram::SampleSet& snapshot, + HistogramPickledList* pickled_histograms) { + + DCHECK(0 != snapshot.TotalCount()); + snapshot.CheckSize(histogram); + + std::string histogram_info = + Histogram::SerializeHistogramInfo(histogram, snapshot); + pickled_histograms->push_back(histogram_info); +} + |