summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/browser_about_handler.cc16
-rw-r--r--chrome/browser/metrics/metrics_service.cc12
-rw-r--r--chrome/browser/metrics/metrics_service.h5
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.cc23
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.h4
-rw-r--r--chrome/chrome.xcodeproj/project.pbxproj8
-rw-r--r--chrome/common/render_messages_internal.h6
-rw-r--r--chrome/renderer/render_thread.cc14
-rw-r--r--chrome/renderer/render_thread.h10
-rw-r--r--chrome/renderer/renderer.scons2
-rw-r--r--chrome/renderer/renderer.vcproj8
-rw-r--r--chrome/renderer/renderer_histogram_snapshots.cc94
-rw-r--r--chrome/renderer/renderer_histogram_snapshots.h54
-rw-r--r--chrome/renderer/renderer_main.cc8
14 files changed, 252 insertions, 12 deletions
diff --git a/chrome/browser/browser_about_handler.cc b/chrome/browser/browser_about_handler.cc
index 7f4c10d..34f2556 100644
--- a/chrome/browser/browser_about_handler.cc
+++ b/chrome/browser/browser_about_handler.cc
@@ -9,6 +9,7 @@
#include "base/file_version_info.h"
#include "base/histogram.h"
+#include "base/platform_thread.h"
#include "base/stats_table.h"
#include "base/string_piece.h"
#include "base/string_util.h"
@@ -21,11 +22,13 @@
#include "chrome/browser/net/dns_global.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/profile_manager.h"
+#include "chrome/browser/renderer_host/render_process_host.h"
#include "chrome/browser/renderer_host/render_view_host.h"
#include "chrome/common/jstemplate_builder.h"
#include "chrome/common/l10n_util.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/pref_service.h"
+#include "chrome/common/render_messages.h"
#include "chrome/common/resource_bundle.h"
#include "chrome/renderer/about_handler.h"
#include "googleurl/src/gurl.h"
@@ -292,7 +295,7 @@ std::string BrowserAboutHandler::AboutVersion() {
// static
std::string BrowserAboutHandler::AboutCredits() {
- static const std::string credits_html =
+ static const std::string credits_html =
ResourceBundle::GetSharedInstance().GetDataResource(
IDR_CREDITS_HTML);
@@ -301,7 +304,7 @@ std::string BrowserAboutHandler::AboutCredits() {
// static
std::string BrowserAboutHandler::AboutTerms() {
- static const std::string terms_html =
+ static const std::string terms_html =
ResourceBundle::GetSharedInstance().GetDataResource(
IDR_TERMS_HTML);
@@ -344,6 +347,15 @@ std::string BrowserAboutHandler::AboutPlugins() {
// static
std::string BrowserAboutHandler::AboutHistograms(const std::string& query) {
std::string data;
+ for (RenderProcessHost::iterator it = RenderProcessHost::begin();
+ it != RenderProcessHost::end(); ++it) {
+ it->second->Send(new ViewMsg_GetRendererHistograms());
+ }
+
+ // TODO(raman): Delay page layout until we get respnoses
+ // back from renderers, and not have to use a fixed size delay.
+ PlatformThread::Sleep(1000);
+
StatisticsRecorder::WriteHTMLGraph(query, &data);
return data;
}
diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc
index 5c9cfda..c50a4c5 100644
--- a/chrome/browser/metrics/metrics_service.cc
+++ b/chrome/browser/metrics/metrics_service.cc
@@ -1755,9 +1755,21 @@ void MetricsService::RecordCurrentState(PrefService* pref) {
RecordPluginChanges(pref);
}
+void MetricsService::CollectRendererHistograms() {
+ for (RenderProcessHost::iterator it = RenderProcessHost::begin();
+ it != RenderProcessHost::end(); ++it) {
+ it->second->Send(new ViewMsg_GetRendererHistograms());
+ }
+}
+
void MetricsService::RecordCurrentHistograms() {
DCHECK(current_log_);
+ CollectRendererHistograms();
+
+ // TODO(raman): Delay the metrics collection activities until we get all the
+ // updates from the renderers, or we time out (1 second? 3 seconds?).
+
StatisticsRecorder::Histograms histograms;
StatisticsRecorder::GetHistograms(&histograms);
for (StatisticsRecorder::Histograms::iterator it = histograms.begin();
diff --git a/chrome/browser/metrics/metrics_service.h b/chrome/browser/metrics/metrics_service.h
index 630d2de..58c491a 100644
--- a/chrome/browser/metrics/metrics_service.h
+++ b/chrome/browser/metrics/metrics_service.h
@@ -342,9 +342,14 @@ class MetricsService : public NotificationObserver,
// buffered plugin stability statistics.
void RecordCurrentState(PrefService* pref);
+ // Requests all renderers to send their histograms back for
+ // collecting stats from renderers.
+ void CollectRendererHistograms();
+
// Record complete list of histograms into the current log.
// Called when we close a log.
void RecordCurrentHistograms();
+
// Record a specific histogram .
void RecordHistogram(const Histogram& histogram);
diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc
index e4ca158..ffded3e 100644
--- a/chrome/browser/renderer_host/resource_message_filter.cc
+++ b/chrome/browser/renderer_host/resource_message_filter.cc
@@ -139,7 +139,7 @@ ResourceMessageFilter::~ResourceMessageFilter() {
void ResourceMessageFilter::OnFilterAdded(IPC::Channel* channel) {
channel_ = channel;
- // Add the observers to intercept
+ // Add the observers to intercept.
NotificationService::current()->AddObserver(
this,
NotificationType::SPELLCHECKER_REINITIALIZED,
@@ -197,6 +197,8 @@ bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& message) {
OnOpenChannelToPlugin)
IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SpellCheck, OnSpellCheck)
IPC_MESSAGE_HANDLER(ViewHostMsg_DnsPrefetch, OnDnsPrefetch)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_RendererHistograms,
+ OnRendererHistograms)
IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_PaintRect,
render_widget_helper_->DidReceivePaintMsg(message))
IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardWriteObjectsAsync,
@@ -412,7 +414,7 @@ void ResourceMessageFilter::OnPluginSyncMessage(const FilePath& plugin_path,
}
}
-#if defined(OS_WIN) // This hack is Windows-specific.
+#if defined(OS_WIN) // This hack is Windows-specific.
void ResourceMessageFilter::OnLoadFont(LOGFONT font) {
// If renderer is running in a sandbox, GetTextMetrics
// can sometimes fail. If a font has not been loaded
@@ -500,7 +502,7 @@ void ResourceMessageFilter::OnClipboardWriteObjects(
// on the UI thread. We'll copy the relevant data and get a handle to any
// shared memory so it doesn't go away when we resume the renderer, and post
// a task to perform the write on the UI thread.
- Clipboard::ObjectMap* long_living_objects = new Clipboard::ObjectMap(objects);
+ Clipboard::ObjectMap* long_living_objects = new Clipboard::ObjectMap(objects);
// We pass the render_handle_ to assist the clipboard with using shared
// memory objects. render_handle_ is a handle to the process that would
@@ -639,7 +641,7 @@ void ResourceMessageFilter::OnResourceTypeStats(
}
void ResourceMessageFilter::OnResolveProxy(const GURL& url,
- IPC::Message* reply_msg) {
+ IPC::Message* reply_msg) {
resolve_proxy_msg_helper_.Start(url, reply_msg);
}
@@ -764,7 +766,7 @@ ClipboardService* ResourceMessageFilter::GetClipboardService() {
// the spellcheck dictionaries into the browser process, and all renderers ask
// the browsers to do SpellChecking.
//
-// This filter should not try to initialize the spellchecker. It is up to the
+// This filter should not try to initialize the spellchecker. It is up to the
// profile to initialize it when required, and send it here. If |spellchecker_|
// is made NULL, it corresponds to spellchecker turned off - i.e., all
// spellings are correct.
@@ -787,7 +789,7 @@ void ResourceMessageFilter::OnSpellCheck(const std::wstring& word,
return;
}
-void ResourceMessageFilter::Observe(NotificationType type,
+void ResourceMessageFilter::Observe(NotificationType type,
const NotificationSource &source,
const NotificationDetails &details) {
if (type == NotificationType::SPELLCHECKER_REINITIALIZED) {
@@ -801,9 +803,14 @@ void ResourceMessageFilter::OnDnsPrefetch(
chrome_browser_net::DnsPrefetchList(hostnames);
}
+void ResourceMessageFilter::OnRendererHistograms(
+ const std::vector<std::string>& histograms) {
+ Histogram::DeserializeHistogramList(histograms);
+}
+
void ResourceMessageFilter::OnCreateAudioStream(
- const IPC::Message& msg, int stream_id,
- const ViewHostMsg_Audio_CreateStream& params) {
+ const IPC::Message& msg, int stream_id,
+ const ViewHostMsg_Audio_CreateStream& params) {
// TODO(hclam): call to AudioRendererHost::CreateStream and send a message to
// renderer to notify the result.
}
diff --git a/chrome/browser/renderer_host/resource_message_filter.h b/chrome/browser/renderer_host/resource_message_filter.h
index 4121a50..ab60be0 100644
--- a/chrome/browser/renderer_host/resource_message_filter.h
+++ b/chrome/browser/renderer_host/resource_message_filter.h
@@ -5,6 +5,9 @@
#ifndef CHROME_BROWSER_RENDERER_HOST_RESOURCE_MSG_FILTER_H_
#define CHROME_BROWSER_RENDERER_HOST_RESOURCE_MSG_FILTER_H_
+#include <string>
+#include <vector>
+
#include "base/clipboard.h"
#include "base/file_path.h"
#include "base/gfx/rect.h"
@@ -146,6 +149,7 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter,
void OnSpellCheck(const std::wstring& word,
IPC::Message* reply_msg);
void OnDnsPrefetch(const std::vector<std::string>& hostnames);
+ void OnRendererHistograms(const std::vector<std::string>& histogram_info);
void OnReceiveContextMenuMsg(const IPC::Message& msg);
// Clipboard messages
void OnClipboardWriteObjects(const Clipboard::ObjectMap& objects);
diff --git a/chrome/chrome.xcodeproj/project.pbxproj b/chrome/chrome.xcodeproj/project.pbxproj
index d6ac699..7dc429d 100644
--- a/chrome/chrome.xcodeproj/project.pbxproj
+++ b/chrome/chrome.xcodeproj/project.pbxproj
@@ -330,6 +330,7 @@
A7C613C10F30D7E4008CEE5D /* mock_render_process_host.cc in Sources */ = {isa = PBXBuildFile; fileRef = A7C613BF0F30D7E4008CEE5D /* mock_render_process_host.cc */; };
A7C6146F0F30DA1D008CEE5D /* ipc_test_sink.cc in Sources */ = {isa = PBXBuildFile; fileRef = A7C6146D0F30DA1D008CEE5D /* ipc_test_sink.cc */; };
A7CBAD390F322A7E00360BF5 /* shell_dialogs_mac.mm in Sources */ = {isa = PBXBuildFile; fileRef = A7CBAD370F322A7E00360BF5 /* shell_dialogs_mac.mm */; };
+ AB3B4B2B0F549D9E0009E2BF /* renderer_histogram_snapshots.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB3B4B290F549D9E0009E2BF /* renderer_histogram_snapshots.cc */; };
AB8963000F4E0901009CFFAC /* audio_renderer_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB8962FA0F4E087E009CFFAC /* audio_renderer_impl.cc */; };
AB8963010F4E0907009CFFAC /* data_source_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB8962FC0F4E087E009CFFAC /* data_source_impl.cc */; };
AB8963020F4E090D009CFFAC /* video_renderer_impl.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB8962FE0F4E087E009CFFAC /* video_renderer_impl.cc */; };
@@ -2523,6 +2524,8 @@
A7C6146E0F30DA1D008CEE5D /* ipc_test_sink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ipc_test_sink.h; sourceTree = "<group>"; };
A7CBAD370F322A7E00360BF5 /* shell_dialogs_mac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = shell_dialogs_mac.mm; sourceTree = "<group>"; };
A9C335E39D39A7DE087850FC /* url_pattern_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = url_pattern_unittest.cc; path = extensions/url_pattern_unittest.cc; sourceTree = "<group>"; };
+ AB3B4B290F549D9E0009E2BF /* renderer_histogram_snapshots.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = renderer_histogram_snapshots.cc; sourceTree = "<group>"; };
+ AB3B4B2A0F549D9E0009E2BF /* renderer_histogram_snapshots.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = renderer_histogram_snapshots.h; sourceTree = "<group>"; };
AB8962FA0F4E087E009CFFAC /* audio_renderer_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = audio_renderer_impl.cc; path = media/audio_renderer_impl.cc; sourceTree = "<group>"; };
AB8962FB0F4E087E009CFFAC /* audio_renderer_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = audio_renderer_impl.h; path = media/audio_renderer_impl.h; sourceTree = "<group>"; };
AB8962FC0F4E087E009CFFAC /* data_source_impl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = data_source_impl.cc; path = media/data_source_impl.cc; sourceTree = "<group>"; };
@@ -3107,6 +3110,8 @@
4D640CD60EAE868600EBCFC0 /* render_widget.h */,
4D640CD70EAE868600EBCFC0 /* render_widget_unittest.cc */,
4D640CD80EAE868600EBCFC0 /* renderer_glue.cc */,
+ AB3B4B290F549D9E0009E2BF /* renderer_histogram_snapshots.cc */,
+ AB3B4B2A0F549D9E0009E2BF /* renderer_histogram_snapshots.h */,
4D640CD90EAE868600EBCFC0 /* renderer_main.cc */,
B51F6D110F37C4DC00152D66 /* renderer_main_platform_delegate.h */,
B51F6D130F37C4DC00152D66 /* renderer_main_platform_delegate_mac.mm */,
@@ -5433,9 +5438,10 @@
3380A6A10F2E91F9004EF74F /* render_process.cc in Sources */,
3380A69D0F2E91D4004EF74F /* render_thread.cc in Sources */,
A7A20E650F3A1E1C00F62B4D /* render_view.cc in Sources */,
- B503E0F00F0175FD00547DC6 /* user_script_slave.cc in Sources */,
+ AB3B4B2B0F549D9E0009E2BF /* renderer_histogram_snapshots.cc in Sources */,
B51F6D2E0F37D04200152D66 /* renderer_main.cc in Sources */,
B51F6D150F37C4DC00152D66 /* renderer_main_platform_delegate_mac.mm in Sources */,
+ B503E0F00F0175FD00547DC6 /* user_script_slave.cc in Sources */,
AB8963020F4E090D009CFFAC /* video_renderer_impl.cc in Sources */,
4D640CF50EAE86EF00EBCFC0 /* visitedlink_slave.cc in Sources */,
);
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index 8475890..46be905 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -460,6 +460,9 @@ IPC_BEGIN_MESSAGES(View)
// resource types.
IPC_MESSAGE_CONTROL0(ViewMsg_GetCacheResourceStats)
+ // Asks the renderer to send back Histograms.
+ IPC_MESSAGE_CONTROL0(ViewMsg_GetRendererHistograms)
+
// Notifies the renderer about ui theme changes
IPC_MESSAGE_ROUTED0(ViewMsg_ThemeChanged)
@@ -1027,6 +1030,9 @@ IPC_BEGIN_MESSAGES(ViewHost)
IPC_MESSAGE_ROUTED1(ViewHostMsg_UserMetricsRecordAction,
std::wstring /* action */)
+ // Send back histograms as vector of pickled-histogram strings.
+ IPC_MESSAGE_CONTROL1(ViewHostMsg_RendererHistograms, std::vector<std::string>)
+
// Request for a DNS prefetch of the names in the array.
// NameList is typedef'ed std::vector<std::string>
IPC_MESSAGE_CONTROL1(ViewHostMsg_DnsPrefetch,
diff --git a/chrome/renderer/render_thread.cc b/chrome/renderer/render_thread.cc
index 58de4ef..6e8e7b0 100644
--- a/chrome/renderer/render_thread.cc
+++ b/chrome/renderer/render_thread.cc
@@ -59,7 +59,8 @@ RenderThread::RenderThread(const std::wstring& channel_name)
MessageLoop::TYPE_UI : MessageLoop::TYPE_DEFAULT, kStackSize)),
visited_link_slave_(NULL),
user_script_slave_(NULL),
- render_dns_master_(NULL) {
+ render_dns_master_(NULL),
+ renderer_histogram_snapshots_(NULL) {
SetChannelName(channel_name);
}
@@ -83,6 +84,10 @@ void RenderThread::Resolve(const char* name, size_t length) {
return render_dns_master_->Resolve(name, length);
}
+void RenderThread::SendHistograms() {
+ return renderer_histogram_snapshots_->SendHistograms();
+}
+
void RenderThread::Init() {
ChildThread::Init();
notification_service_.reset(new NotificationService);
@@ -97,6 +102,7 @@ void RenderThread::Init() {
visited_link_slave_ = new VisitedLinkSlave();
user_script_slave_ = new UserScriptSlave();
render_dns_master_.reset(new RenderDnsMaster());
+ renderer_histogram_snapshots_.reset(new RendererHistogramSnapshots());
}
void RenderThread::CleanUp() {
@@ -140,6 +146,8 @@ void RenderThread::OnControlMessageReceived(const IPC::Message& msg) {
// is there a new non-windows message I should add here?
IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView)
IPC_MESSAGE_HANDLER(ViewMsg_SetCacheCapacities, OnSetCacheCapacities)
+ IPC_MESSAGE_HANDLER(ViewMsg_GetRendererHistograms,
+ OnGetRendererHistograms)
IPC_MESSAGE_HANDLER(ViewMsg_GetCacheResourceStats,
OnGetCacheResourceStats)
IPC_MESSAGE_HANDLER(ViewMsg_PluginMessage, OnPluginMessage)
@@ -212,6 +220,10 @@ void RenderThread::OnGetCacheResourceStats() {
#endif
}
+void RenderThread::OnGetRendererHistograms() {
+ SendHistograms();
+}
+
void RenderThread::InformHostOfCacheStats() {
#if defined(OS_WIN) || defined(OS_LINUX)
CacheManager::UsageStats stats;
diff --git a/chrome/renderer/render_thread.h b/chrome/renderer/render_thread.h
index 54043ca..a23776e 100644
--- a/chrome/renderer/render_thread.h
+++ b/chrome/renderer/render_thread.h
@@ -12,10 +12,12 @@
#include "base/task.h"
#include "build/build_config.h"
#include "chrome/common/child_thread.h"
+#include "chrome/renderer/renderer_histogram_snapshots.h"
class FilePath;
class NotificationService;
class RenderDnsMaster;
+class RendererHistogram;
class SkBitmap;
class UserScriptSlave;
class VisitedLinkSlave;
@@ -86,6 +88,9 @@ class RenderThread : public RenderThreadBase,
// Do DNS prefetch resolution of a hostname.
void Resolve(const char* name, size_t length);
+ // Send all the Histogram data to browser.
+ void SendHistograms();
+
// Invokes InformHostOfCacheStats after a short delay. Used to move this
// bookkeeping operation off the critical latency path.
void InformHostOfCacheStatsLater();
@@ -113,6 +118,9 @@ class RenderThread : public RenderThreadBase,
size_t capacity);
void OnGetCacheResourceStats();
+ // Send all histograms to browser.
+ void OnGetRendererHistograms();
+
// Gather usage statistics from the in-memory cache and inform our host.
// These functions should be call periodically so that the host can make
// decisions about how to allocation resources using current information.
@@ -124,6 +132,8 @@ class RenderThread : public RenderThreadBase,
scoped_ptr<RenderDnsMaster> render_dns_master_;
+ scoped_ptr<RendererHistogramSnapshots> renderer_histogram_snapshots_;
+
scoped_ptr<ScopedRunnableMethodFactory<RenderThread> > cache_stats_factory_;
scoped_ptr<NotificationService> notification_service_;
diff --git a/chrome/renderer/renderer.scons b/chrome/renderer/renderer.scons
index c03848b..3bb0d17 100644
--- a/chrome/renderer/renderer.scons
+++ b/chrome/renderer/renderer.scons
@@ -83,6 +83,8 @@ input_files = ChromeFileList([
'render_widget.cc',
'render_widget.h',
'renderer_glue.cc',
+ 'renderer_histogram_snapshots.cc',
+ 'renderer_histogram_snapshots.h',
'renderer_main.cc',
'renderer_resources.h',
'user_script_slave.cc',
diff --git a/chrome/renderer/renderer.vcproj b/chrome/renderer/renderer.vcproj
index 7e50f8f..684ec52 100644
--- a/chrome/renderer/renderer.vcproj
+++ b/chrome/renderer/renderer.vcproj
@@ -298,6 +298,14 @@
>
</File>
<File
+ RelativePath=".\renderer_histogram_snapshots.cc"
+ >
+ </File>
+ <File
+ RelativePath=".\renderer_histogram_snapshots.h"
+ >
+ </File>
+ <File
RelativePath=".\renderer_main.cc"
>
</File>
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);
+}
+
diff --git a/chrome/renderer/renderer_histogram_snapshots.h b/chrome/renderer/renderer_histogram_snapshots.h
new file mode 100644
index 0000000..b3d7fb1
--- /dev/null
+++ b/chrome/renderer/renderer_histogram_snapshots.h
@@ -0,0 +1,54 @@
+// 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.
+
+#ifndef CHROME_RENDERER_HISTOGRAM_SNAPSHOTS_H_
+#define CHROME_RENDERER_HISTOGRAM_SNAPSHOTS_H_
+
+#include <list>
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/histogram.h"
+#include "base/process.h"
+#include "base/scoped_ptr.h"
+#include "base/task.h"
+
+class RendererHistogramSnapshots {
+ public:
+ RendererHistogramSnapshots();
+
+ ~RendererHistogramSnapshots() {}
+
+ // Send the histogram data.
+ void SendHistograms();
+
+ // Maintain a map of histogram names to the sample stats we've sent.
+ typedef std::map<std::string, Histogram::SampleSet> LoggedSampleMap;
+ typedef std::vector<std::string> HistogramPickledList;
+
+ private:
+ // Extract snapshot data and then send it off the the Browser process.
+ // Send only a delta to what we have already sent.
+ void UploadAllHistrograms();
+ void UploadHistrogram(const Histogram& histogram,
+ HistogramPickledList* histograms);
+ void UploadHistogramDelta(const Histogram& histogram,
+ const Histogram::SampleSet& snapshot,
+ HistogramPickledList* histograms);
+
+ ScopedRunnableMethodFactory<RendererHistogramSnapshots>
+ renderer_histogram_snapshots_factory_;
+
+ // For histograms, record what we've already logged (as a sample for each
+ // histogram) so that we can send only the delta with the next log.
+ LoggedSampleMap logged_samples_;
+
+ DISALLOW_COPY_AND_ASSIGN(RendererHistogramSnapshots);
+};
+
+#endif // CHROME_RENDERER_HISTOGRAM_SNAPSHOTS_H_
+
diff --git a/chrome/renderer/renderer_main.cc b/chrome/renderer/renderer_main.cc
index b79e9e5..8e70dee 100644
--- a/chrome/renderer/renderer_main.cc
+++ b/chrome/renderer/renderer_main.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/command_line.h"
+#include "base/histogram.h"
#include "base/message_loop.h"
#include "base/path_service.h"
#include "base/platform_thread.h"
@@ -89,6 +90,13 @@ int RendererMain(const MainFunctionParams& parameters) {
HandleRendererErrorTestParameters(parsed_command_line);
+ // Initialize histogram statistics gathering system.
+ // Don't create StatisticsRecorde in the single process mode.
+ scoped_ptr<StatisticsRecorder> statistics;
+ if (!StatisticsRecorder::WasStarted()) {
+ statistics.reset(new StatisticsRecorder());
+ }
+
{
RenderProcess render_process;
bool run_loop = true;