blob: b1bc91c307aa78ea6d06fbbfa100b68f3b312f7c [file] [log] [blame]
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00001// Copyright 2009-2010 the V8 project authors. All rights reserved.
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +00002// 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
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000031#include "isolate.h"
ager@chromium.orgce5e87b2010-03-10 10:24:18 +000032
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +000033namespace v8 {
34namespace internal {
35
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000036class HeapSnapshot;
37class HeapSnapshotsCollection;
38
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000039#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 } \
ricow@chromium.org4980dff2010-07-19 08:33:45 +000045 } while (false)
ricow@chromium.org5ad5ace2010-06-23 09:06:43 +000046
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +000047// 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:
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000051 static void Setup();
52 static void TearDown();
ricow@chromium.org5ad5ace2010-06-23 09:06:43 +000053
ager@chromium.org5f0c45f2010-12-17 08:51:21 +000054 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);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000060 static int GetSnapshotsCount();
61 static HeapSnapshot* GetSnapshot(int index);
62 static HeapSnapshot* FindSnapshot(unsigned uid);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000063 static void DeleteAllSnapshots();
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000064
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000065 void ObjectMoveEvent(Address from, Address to);
ricow@chromium.org4980dff2010-07-19 08:33:45 +000066
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000067 void DefineWrapperClass(
whesse@chromium.orgb08986c2011-03-14 16:13:42 +000068 uint16_t class_id, v8::HeapProfiler::WrapperInfoCallback callback);
whesse@chromium.orgb08986c2011-03-14 16:13:42 +000069
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000070 v8::RetainedObjectInfo* ExecuteWrapperClassCallback(uint16_t class_id,
71 Object** wrapper);
72 INLINE(bool is_profiling()) {
73 return snapshots_->is_tracking_objects();
ricow@chromium.org4980dff2010-07-19 08:33:45 +000074 }
75
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +000076 private:
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000077 HeapProfiler();
78 ~HeapProfiler();
ager@chromium.org5f0c45f2010-12-17 08:51:21 +000079 HeapSnapshot* TakeSnapshotImpl(const char* name,
80 int type,
81 v8::ActivityControl* control);
82 HeapSnapshot* TakeSnapshotImpl(String* name,
83 int type,
84 v8::ActivityControl* control);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000085 void ResetSnapshots();
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000086
87 HeapSnapshotsCollection* snapshots_;
88 unsigned next_snapshot_uid_;
whesse@chromium.orgb08986c2011-03-14 16:13:42 +000089 List<v8::HeapProfiler::WrapperInfoCallback> wrapper_callbacks_;
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +000090};
91
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +000092} } // namespace v8::internal
93
94#endif // V8_HEAP_PROFILER_H_