memory_benchmarking_extension.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/renderer/memory_benchmarking_extension.h" 6 7#include "base/string_util.h" 8#include "content/public/renderer/render_thread.h" 9 10#if !defined(NO_TCMALLOC) && defined(OS_LINUX) 11#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" 12#endif // !defined(NO_TCMALLOC) && defined(OS_LINUX) 13 14namespace { 15 16const char kMemoryBenchmarkingExtensionName[] = "v8/MemoryBenchmarking"; 17 18} 19 20namespace { 21 22class MemoryBenchmarkingWrapper : public v8::Extension { 23 public: 24 MemoryBenchmarkingWrapper() : 25 v8::Extension(kMemoryBenchmarkingExtensionName, 26 "if (typeof(chrome) == 'undefined') {" 27 " chrome = {};" 28 "};" 29 "if (typeof(chrome.memoryBenchmarking) == 'undefined') {" 30 " chrome.memoryBenchmarking = {};" 31 "};" 32 "chrome.memoryBenchmarking.isHeapProfilerRunning = function() {" 33 " native function IsHeapProfilerRunning();" 34 " return IsHeapProfilerRunning();" 35 "};" 36 "chrome.memoryBenchmarking.heapProfilerDump = function(reason) {" 37 " native function HeapProfilerDump();" 38 " return HeapProfilerDump(reason);" 39 "};" 40 ) {} 41 42 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( 43 v8::Handle<v8::String> name) OVERRIDE { 44 if (name->Equals(v8::String::New("IsHeapProfilerRunning"))) 45 return v8::FunctionTemplate::New(IsHeapProfilerRunning); 46 else if (name->Equals(v8::String::New("HeapProfilerDump"))) 47 return v8::FunctionTemplate::New(HeapProfilerDump); 48 49 return v8::Handle<v8::FunctionTemplate>(); 50 } 51 52 static v8::Handle<v8::Value> IsHeapProfilerRunning( 53 const v8::Arguments& args) { 54#if !defined(NO_TCMALLOC) && defined(OS_LINUX) 55 return v8::Boolean::New(::IsHeapProfilerRunning()); 56#else 57 return v8::Boolean::New(false); 58#endif // !defined(NO_TCMALLOC) && defined(OS_LINUX) 59 } 60 61 static v8::Handle<v8::Value> HeapProfilerDump(const v8::Arguments& args) { 62#if !defined(NO_TCMALLOC) && defined(OS_LINUX) 63 char dumped_filename_buffer[1000]; 64 std::string reason("benchmarking_extension"); 65 if (args.Length() && args[0]->IsString()) 66 reason = *v8::String::AsciiValue(args[0]); 67 ::HeapProfilerDumpWithFileName(reason.c_str(), 68 dumped_filename_buffer, 69 sizeof(dumped_filename_buffer)); 70 return v8::String::New(dumped_filename_buffer); 71#endif // !defined(NO_TCMALLOC) && defined(OS_LINUX) 72 return v8::Undefined(); 73 } 74}; 75 76} // namespace 77 78namespace content { 79 80v8::Extension* MemoryBenchmarkingExtension::Get() { 81 return new MemoryBenchmarkingWrapper(); 82} 83 84} // namespace content 85