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