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.
5 #include "content/renderer/memory_benchmarking_extension.h"
7 #include "base/string_util.h"
8 #include "content/public/renderer/render_thread.h"
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)
16 const char kMemoryBenchmarkingExtensionName
[] = "v8/MemoryBenchmarking";
22 class MemoryBenchmarkingWrapper
: public v8::Extension
{
24 MemoryBenchmarkingWrapper() :
25 v8::Extension(kMemoryBenchmarkingExtensionName
,
26 "if (typeof(chrome) == 'undefined') {"
29 "if (typeof(chrome.memoryBenchmarking) == 'undefined') {"
30 " chrome.memoryBenchmarking = {};"
32 "chrome.memoryBenchmarking.isHeapProfilerRunning = function() {"
33 " native function IsHeapProfilerRunning();"
34 " return IsHeapProfilerRunning();"
36 "chrome.memoryBenchmarking.heapProfilerDump = function(reason) {"
37 " native function HeapProfilerDump();"
38 " return HeapProfilerDump(reason);"
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
);
49 return v8::Handle
<v8::FunctionTemplate
>();
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());
57 return v8::Boolean::New(false);
58 #endif // !defined(NO_TCMALLOC) && defined(OS_LINUX)
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();
80 v8::Extension
* MemoryBenchmarkingExtension::Get() {
81 return new MemoryBenchmarkingWrapper();
84 } // namespace content