| // Copyright (c) 2013 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/renderer/memory_benchmarking_extension.h" |
| |
| #include "base/strings/string_util.h" |
| #include "content/common/memory_benchmark_messages.h" |
| #include "content/renderer/render_thread_impl.h" |
| |
| #if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) |
| |
| #include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" |
| |
| namespace { |
| |
| const char kMemoryBenchmarkingExtensionName[] = "v8/MemoryBenchmarking"; |
| |
| } |
| |
| namespace { |
| |
| class MemoryBenchmarkingWrapper : public v8::Extension { |
| public: |
| MemoryBenchmarkingWrapper() : |
| v8::Extension(kMemoryBenchmarkingExtensionName, |
| "if (typeof(chrome) == 'undefined') {" |
| " chrome = {};" |
| "};" |
| "if (typeof(chrome.memoryBenchmarking) == 'undefined') {" |
| " chrome.memoryBenchmarking = {};" |
| "};" |
| "chrome.memoryBenchmarking.isHeapProfilerRunning = function() {" |
| " native function IsHeapProfilerRunning();" |
| " return IsHeapProfilerRunning();" |
| "};" |
| "chrome.memoryBenchmarking.heapProfilerDump = " |
| " function(process_type, reason) {" |
| " native function HeapProfilerDump();" |
| " HeapProfilerDump(process_type, reason);" |
| "};" |
| ) {} |
| |
| virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( |
| v8::Handle<v8::String> name) OVERRIDE { |
| if (name->Equals(v8::String::New("IsHeapProfilerRunning"))) |
| return v8::FunctionTemplate::New(IsHeapProfilerRunning); |
| else if (name->Equals(v8::String::New("HeapProfilerDump"))) |
| return v8::FunctionTemplate::New(HeapProfilerDump); |
| |
| return v8::Handle<v8::FunctionTemplate>(); |
| } |
| |
| static void IsHeapProfilerRunning( |
| const v8::FunctionCallbackInfo<v8::Value>& args) { |
| args.GetReturnValue().Set(::IsHeapProfilerRunning()); |
| } |
| |
| static void HeapProfilerDump( |
| const v8::FunctionCallbackInfo<v8::Value>& args) { |
| std::string process_type; |
| if (args.Length() && args[0]->IsString()) |
| process_type = *v8::String::AsciiValue(args[0]); |
| std::string reason("benchmarking_extension"); |
| if (args.Length() > 1 && args[1]->IsString()) |
| reason = *v8::String::AsciiValue(args[1]); |
| if (process_type == "browser") { |
| content::RenderThreadImpl::current()->Send( |
| new MemoryBenchmarkHostMsg_HeapProfilerDump(reason)); |
| } else { |
| ::HeapProfilerDump(reason.c_str()); |
| } |
| } |
| }; |
| |
| } // namespace |
| |
| namespace content { |
| |
| v8::Extension* MemoryBenchmarkingExtension::Get() { |
| return new MemoryBenchmarkingWrapper(); |
| } |
| |
| } // namespace content |
| |
| #endif // defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) |