| Index: content/browser/tcmalloc_internals_request_job.cc
|
| diff --git a/content/browser/tcmalloc_internals_request_job.cc b/content/browser/tcmalloc_internals_request_job.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..db0c3dce7e5ff99eb597d4789a150c69747e1d18
|
| --- /dev/null
|
| +++ b/content/browser/tcmalloc_internals_request_job.cc
|
| @@ -0,0 +1,117 @@
|
| +// Copyright (c) 2012 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 "content/browser/tcmalloc_internals_request_job.h"
|
| +
|
| +#include "content/common/child_process_messages.h"
|
| +#include "content/public/browser/browser_child_process_host_iterator.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/render_process_host.h"
|
| +#include "content/public/common/process_type.h"
|
| +
|
| +#if defined(USE_TCMALLOC)
|
| +#include "third_party/tcmalloc/chromium/src/gperftools/malloc_extension.h"
|
| +#endif
|
| +
|
| +namespace content {
|
| +
|
| +// static
|
| +AboutTcmallocOutputs* AboutTcmallocOutputs::GetInstance() {
|
| + return Singleton<AboutTcmallocOutputs>::get();
|
| +}
|
| +
|
| +AboutTcmallocOutputs::AboutTcmallocOutputs() {}
|
| +
|
| +AboutTcmallocOutputs::~AboutTcmallocOutputs() {}
|
| +
|
| +void AboutTcmallocOutputs::OnStatsForChildProcess(
|
| + base::ProcessId pid, ProcessType process_type,
|
| + const std::string& output) {
|
| + std::string header = GetProcessTypeNameInEnglish(process_type);
|
| + base::StringAppendF(&header, " PID %d", static_cast<int>(pid));
|
| + SetOutput(header, output);
|
| +}
|
| +
|
| +void AboutTcmallocOutputs::SetOutput(const std::string& header,
|
| + const std::string& output) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + outputs_[header] = output;
|
| +}
|
| +
|
| +void AboutTcmallocOutputs::DumpToHTMLTable(std::string* data) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + data->append("<table width=\"100%\">\n");
|
| + for (AboutTcmallocOutputsType::const_iterator oit = outputs_.begin();
|
| + oit != outputs_.end();
|
| + oit++) {
|
| + data->append("<tr><td bgcolor=\"yellow\">");
|
| + data->append(oit->first);
|
| + data->append("</td></tr>\n");
|
| + data->append("<tr><td><pre>\n");
|
| + data->append(oit->second);
|
| + data->append("</pre></td></tr>\n");
|
| + }
|
| + data->append("</table>\n");
|
| + outputs_.clear();
|
| +}
|
| +
|
| +TcmallocInternalsRequestJob::TcmallocInternalsRequestJob(
|
| + net::URLRequest* request) : net::URLRequestSimpleJob(request) {
|
| +}
|
| +
|
| +#if defined(USE_TCMALLOC)
|
| +void RequestTcmallocStatsFromChildRenderProcesses() {
|
| + RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
|
| + while (!it.IsAtEnd()) {
|
| + it.GetCurrentValue()->Send(new ChildProcessMsg_GetTcmallocStats);
|
| + it.Advance();
|
| + }
|
| +}
|
| +
|
| +void AboutTcmalloc(std::string* data) {
|
| + data->append("<!DOCTYPE html>\n<html>\n<head>\n");
|
| + data->append("<title>tcmalloc stats</title>");
|
| + data->append("</head><body>");
|
| +
|
| + // Display any stats for which we sent off requests the last time.
|
| + data->append("<p>Stats as of last page load;");
|
| + data->append("reload to get stats as of this page load.</p>\n");
|
| + data->append("<table width=\"100%\">\n");
|
| +
|
| + AboutTcmallocOutputs::GetInstance()->DumpToHTMLTable(data);
|
| +
|
| + data->append("</body></html>\n");
|
| +
|
| + // Populate the collector with stats from the local browser process
|
| + // and send off requests to all the renderer processes.
|
| + char buffer[1024 * 32];
|
| + MallocExtension::instance()->GetStats(buffer, sizeof(buffer));
|
| + std::string browser("Browser");
|
| + AboutTcmallocOutputs::GetInstance()->SetOutput(browser, buffer);
|
| +
|
| + for (BrowserChildProcessHostIterator iter; !iter.Done(); ++iter) {
|
| + iter.Send(new ChildProcessMsg_GetTcmallocStats);
|
| + }
|
| +
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
|
| + &RequestTcmallocStatsFromChildRenderProcesses));
|
| +}
|
| +#endif
|
| +
|
| +bool TcmallocInternalsRequestJob::GetData(std::string* mime_type,
|
| + std::string* charset,
|
| + std::string* data) const {
|
| + mime_type->assign("text/html");
|
| + charset->assign("UTF8");
|
| +
|
| + data->clear();
|
| +#if defined(USE_TCMALLOC)
|
| + AboutTcmalloc(data);
|
| +#endif
|
| + return true;
|
| +}
|
| +
|
| +} // namespace content
|
|
|