blob: 346177b8ba0712ddb2ed1eb95f368accf9205d0d [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 +000047class HeapProfiler {
48 public:
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +000049 static void SetUp();
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000050 static void TearDown();
ricow@chromium.org5ad5ace2010-06-23 09:06:43 +000051
mmassi@chromium.org7028c052012-06-13 11:51:58 +000052 static size_t GetMemorySizeUsedByProfiler();
53
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);
jkummerow@chromium.org28faa982012-04-13 09:58:30 +000060
61 static void StartHeapObjectsTracking();
62 static void StopHeapObjectsTracking();
rossberg@chromium.org400388e2012-06-06 09:29:22 +000063 static SnapshotObjectId PushHeapObjectsStats(OutputStream* stream);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000064 static int GetSnapshotsCount();
65 static HeapSnapshot* GetSnapshot(int index);
66 static HeapSnapshot* FindSnapshot(unsigned uid);
erik.corry@gmail.comed49e962012-04-17 11:57:53 +000067 static SnapshotObjectId GetSnapshotObjectId(Handle<Object> obj);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000068 static void DeleteAllSnapshots();
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000069
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000070 void ObjectMoveEvent(Address from, Address to);
ricow@chromium.org4980dff2010-07-19 08:33:45 +000071
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000072 void DefineWrapperClass(
whesse@chromium.orgb08986c2011-03-14 16:13:42 +000073 uint16_t class_id, v8::HeapProfiler::WrapperInfoCallback callback);
whesse@chromium.orgb08986c2011-03-14 16:13:42 +000074
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000075 v8::RetainedObjectInfo* ExecuteWrapperClassCallback(uint16_t class_id,
76 Object** wrapper);
77 INLINE(bool is_profiling()) {
78 return snapshots_->is_tracking_objects();
ricow@chromium.org4980dff2010-07-19 08:33:45 +000079 }
80
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +000081 private:
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000082 HeapProfiler();
83 ~HeapProfiler();
ager@chromium.org5f0c45f2010-12-17 08:51:21 +000084 HeapSnapshot* TakeSnapshotImpl(const char* name,
85 int type,
86 v8::ActivityControl* control);
87 HeapSnapshot* TakeSnapshotImpl(String* name,
88 int type,
89 v8::ActivityControl* control);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000090 void ResetSnapshots();
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000091
jkummerow@chromium.org28faa982012-04-13 09:58:30 +000092 void StartHeapObjectsTrackingImpl();
93 void StopHeapObjectsTrackingImpl();
rossberg@chromium.org400388e2012-06-06 09:29:22 +000094 SnapshotObjectId PushHeapObjectsStatsImpl(OutputStream* stream);
jkummerow@chromium.org28faa982012-04-13 09:58:30 +000095
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000096 HeapSnapshotsCollection* snapshots_;
97 unsigned next_snapshot_uid_;
whesse@chromium.orgb08986c2011-03-14 16:13:42 +000098 List<v8::HeapProfiler::WrapperInfoCallback> wrapper_callbacks_;
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +000099};
100
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +0000101} } // namespace v8::internal
102
103#endif // V8_HEAP_PROFILER_H_