heap-profiler.h revision 85b71799222b55eb5dd74ea26efe0c64ab655c8c
1// Copyright 2009-2010 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6//     * Redistributions of source code must retain the above copyright
7//       notice, this list of conditions and the following disclaimer.
8//     * Redistributions in binary form must reproduce the above
9//       copyright notice, this list of conditions and the following
10//       disclaimer in the documentation and/or other materials provided
11//       with the distribution.
12//     * Neither the name of Google Inc. nor the names of its
13//       contributors may be used to endorse or promote products derived
14//       from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef V8_HEAP_PROFILER_H_
29#define V8_HEAP_PROFILER_H_
30
31#include "isolate.h"
32
33namespace v8 {
34namespace internal {
35
36class HeapSnapshot;
37class HeapSnapshotsCollection;
38
39#define HEAP_PROFILE(heap, call)                                             \
40  do {                                                                       \
41    v8::internal::HeapProfiler* profiler = heap->isolate()->heap_profiler(); \
42    if (profiler != NULL && profiler->is_profiling()) {                      \
43      profiler->call;                                                        \
44    }                                                                        \
45  } while (false)
46
47// The HeapProfiler writes data to the log files, which can be postprocessed
48// to generate .hp files for use by the GHC/Valgrind tool hp2ps.
49class HeapProfiler {
50 public:
51  static void Setup();
52  static void TearDown();
53
54  static HeapSnapshot* TakeSnapshot(const char* name,
55                                    int type,
56                                    v8::ActivityControl* control);
57  static HeapSnapshot* TakeSnapshot(String* name,
58                                    int type,
59                                    v8::ActivityControl* control);
60  static int GetSnapshotsCount();
61  static HeapSnapshot* GetSnapshot(int index);
62  static HeapSnapshot* FindSnapshot(unsigned uid);
63  static void DeleteAllSnapshots();
64
65  void ObjectMoveEvent(Address from, Address to);
66
67  void DefineWrapperClass(
68      uint16_t class_id, v8::HeapProfiler::WrapperInfoCallback callback);
69
70  v8::RetainedObjectInfo* ExecuteWrapperClassCallback(uint16_t class_id,
71                                                      Object** wrapper);
72  INLINE(bool is_profiling()) {
73    return snapshots_->is_tracking_objects();
74  }
75
76 private:
77  HeapProfiler();
78  ~HeapProfiler();
79  HeapSnapshot* TakeSnapshotImpl(const char* name,
80                                 int type,
81                                 v8::ActivityControl* control);
82  HeapSnapshot* TakeSnapshotImpl(String* name,
83                                 int type,
84                                 v8::ActivityControl* control);
85  void ResetSnapshots();
86
87  HeapSnapshotsCollection* snapshots_;
88  unsigned next_snapshot_uid_;
89  List<v8::HeapProfiler::WrapperInfoCallback> wrapper_callbacks_;
90};
91
92} }  // namespace v8::internal
93
94#endif  // V8_HEAP_PROFILER_H_
95