blob: c8c94f58d60f485c646b57e08fa70f7741790541 [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
mstarzinger@chromium.org32280cf2012-12-06 17:32:37 +000054 static HeapSnapshot* TakeSnapshot(
55 const char* name,
56 int type,
57 v8::ActivityControl* control,
58 v8::HeapProfiler::ObjectNameResolver* resolver);
59 static HeapSnapshot* TakeSnapshot(
60 String* name,
61 int type,
62 v8::ActivityControl* control,
63 v8::HeapProfiler::ObjectNameResolver* resolver);
jkummerow@chromium.org28faa982012-04-13 09:58:30 +000064
65 static void StartHeapObjectsTracking();
66 static void StopHeapObjectsTracking();
rossberg@chromium.org400388e2012-06-06 09:29:22 +000067 static SnapshotObjectId PushHeapObjectsStats(OutputStream* stream);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000068 static int GetSnapshotsCount();
69 static HeapSnapshot* GetSnapshot(int index);
70 static HeapSnapshot* FindSnapshot(unsigned uid);
erik.corry@gmail.comed49e962012-04-17 11:57:53 +000071 static SnapshotObjectId GetSnapshotObjectId(Handle<Object> obj);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000072 static void DeleteAllSnapshots();
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000073
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000074 void ObjectMoveEvent(Address from, Address to);
ricow@chromium.org4980dff2010-07-19 08:33:45 +000075
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000076 void DefineWrapperClass(
whesse@chromium.orgb08986c2011-03-14 16:13:42 +000077 uint16_t class_id, v8::HeapProfiler::WrapperInfoCallback callback);
whesse@chromium.orgb08986c2011-03-14 16:13:42 +000078
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000079 v8::RetainedObjectInfo* ExecuteWrapperClassCallback(uint16_t class_id,
80 Object** wrapper);
81 INLINE(bool is_profiling()) {
82 return snapshots_->is_tracking_objects();
ricow@chromium.org4980dff2010-07-19 08:33:45 +000083 }
84
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +000085 private:
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +000086 explicit HeapProfiler(Heap* heap);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000087 ~HeapProfiler();
mstarzinger@chromium.org32280cf2012-12-06 17:32:37 +000088 HeapSnapshot* TakeSnapshotImpl(
89 const char* name,
90 int type,
91 v8::ActivityControl* control,
92 v8::HeapProfiler::ObjectNameResolver* resolver);
93 HeapSnapshot* TakeSnapshotImpl(
94 String* name,
95 int type,
96 v8::ActivityControl* control,
97 v8::HeapProfiler::ObjectNameResolver* resolver);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000098 void ResetSnapshots();
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000099
jkummerow@chromium.org28faa982012-04-13 09:58:30 +0000100 void StartHeapObjectsTrackingImpl();
101 void StopHeapObjectsTrackingImpl();
rossberg@chromium.org400388e2012-06-06 09:29:22 +0000102 SnapshotObjectId PushHeapObjectsStatsImpl(OutputStream* stream);
jkummerow@chromium.org28faa982012-04-13 09:58:30 +0000103
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +0000104 Heap* heap() const { return snapshots_->heap(); }
105
whesse@chromium.org2c186ca2010-06-16 11:32:39 +0000106 HeapSnapshotsCollection* snapshots_;
107 unsigned next_snapshot_uid_;
whesse@chromium.orgb08986c2011-03-14 16:13:42 +0000108 List<v8::HeapProfiler::WrapperInfoCallback> wrapper_callbacks_;
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +0000109};
110
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +0000111} } // namespace v8::internal
112
113#endif // V8_HEAP_PROFILER_H_