blob: 301b09993e7eb094703736747f8deb51e4f51775 [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#include "v8.h"
29
30#include "heap-profiler.h"
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000031#include "profile-generator.h"
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +000032
33namespace v8 {
34namespace internal {
35
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000036HeapProfiler::HeapProfiler()
37 : snapshots_(new HeapSnapshotsCollection()),
38 next_snapshot_uid_(1) {
39}
40
41
42HeapProfiler::~HeapProfiler() {
43 delete snapshots_;
44}
45
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000046
47void HeapProfiler::ResetSnapshots() {
48 delete snapshots_;
49 snapshots_ = new HeapSnapshotsCollection();
50}
51
52
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +000053void HeapProfiler::SetUp() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000054 Isolate* isolate = Isolate::Current();
55 if (isolate->heap_profiler() == NULL) {
56 isolate->set_heap_profiler(new HeapProfiler());
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000057 }
58}
59
60
61void HeapProfiler::TearDown() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000062 Isolate* isolate = Isolate::Current();
63 delete isolate->heap_profiler();
64 isolate->set_heap_profiler(NULL);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000065}
66
67
ager@chromium.org5f0c45f2010-12-17 08:51:21 +000068HeapSnapshot* HeapProfiler::TakeSnapshot(const char* name,
69 int type,
70 v8::ActivityControl* control) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000071 ASSERT(Isolate::Current()->heap_profiler() != NULL);
72 return Isolate::Current()->heap_profiler()->TakeSnapshotImpl(name,
73 type,
74 control);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000075}
76
77
ager@chromium.org5f0c45f2010-12-17 08:51:21 +000078HeapSnapshot* HeapProfiler::TakeSnapshot(String* name,
79 int type,
80 v8::ActivityControl* control) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000081 ASSERT(Isolate::Current()->heap_profiler() != NULL);
82 return Isolate::Current()->heap_profiler()->TakeSnapshotImpl(name,
83 type,
84 control);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +000085}
86
87
jkummerow@chromium.org28faa982012-04-13 09:58:30 +000088void HeapProfiler::StartHeapObjectsTracking() {
89 ASSERT(Isolate::Current()->heap_profiler() != NULL);
90 Isolate::Current()->heap_profiler()->StartHeapObjectsTrackingImpl();
91}
92
93
94void HeapProfiler::StopHeapObjectsTracking() {
95 ASSERT(Isolate::Current()->heap_profiler() != NULL);
96 Isolate::Current()->heap_profiler()->StopHeapObjectsTrackingImpl();
97}
98
99
rossberg@chromium.org400388e2012-06-06 09:29:22 +0000100SnapshotObjectId HeapProfiler::PushHeapObjectsStats(v8::OutputStream* stream) {
jkummerow@chromium.org28faa982012-04-13 09:58:30 +0000101 ASSERT(Isolate::Current()->heap_profiler() != NULL);
102 return Isolate::Current()->heap_profiler()->PushHeapObjectsStatsImpl(stream);
103}
104
105
whesse@chromium.orgb08986c2011-03-14 16:13:42 +0000106void HeapProfiler::DefineWrapperClass(
107 uint16_t class_id, v8::HeapProfiler::WrapperInfoCallback callback) {
whesse@chromium.orgb08986c2011-03-14 16:13:42 +0000108 ASSERT(class_id != v8::HeapProfiler::kPersistentHandleNoClassId);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000109 if (wrapper_callbacks_.length() <= class_id) {
110 wrapper_callbacks_.AddBlock(
111 NULL, class_id - wrapper_callbacks_.length() + 1);
whesse@chromium.orgb08986c2011-03-14 16:13:42 +0000112 }
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000113 wrapper_callbacks_[class_id] = callback;
whesse@chromium.orgb08986c2011-03-14 16:13:42 +0000114}
115
116
117v8::RetainedObjectInfo* HeapProfiler::ExecuteWrapperClassCallback(
118 uint16_t class_id, Object** wrapper) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000119 if (wrapper_callbacks_.length() <= class_id) return NULL;
120 return wrapper_callbacks_[class_id](
whesse@chromium.orgb08986c2011-03-14 16:13:42 +0000121 class_id, Utils::ToLocal(Handle<Object>(wrapper)));
122}
123
124
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000125HeapSnapshot* HeapProfiler::TakeSnapshotImpl(const char* name,
126 int type,
127 v8::ActivityControl* control) {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +0000128 HeapSnapshot::Type s_type = static_cast<HeapSnapshot::Type>(type);
129 HeapSnapshot* result =
130 snapshots_->NewSnapshot(s_type, name, next_snapshot_uid_++);
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000131 bool generation_completed = true;
erik.corry@gmail.com145eff52010-08-23 11:36:18 +0000132 switch (s_type) {
133 case HeapSnapshot::kFull: {
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000134 HeapSnapshotGenerator generator(result, control);
135 generation_completed = generator.GenerateSnapshot();
erik.corry@gmail.com145eff52010-08-23 11:36:18 +0000136 break;
137 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +0000138 default:
139 UNREACHABLE();
140 }
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000141 if (!generation_completed) {
142 delete result;
143 result = NULL;
144 }
145 snapshots_->SnapshotGenerationFinished(result);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +0000146 return result;
147}
148
149
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000150HeapSnapshot* HeapProfiler::TakeSnapshotImpl(String* name,
151 int type,
152 v8::ActivityControl* control) {
whesse@chromium.orgb08986c2011-03-14 16:13:42 +0000153 return TakeSnapshotImpl(snapshots_->names()->GetName(name), type, control);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +0000154}
155
jkummerow@chromium.org28faa982012-04-13 09:58:30 +0000156void HeapProfiler::StartHeapObjectsTrackingImpl() {
157 snapshots_->StartHeapObjectsTracking();
158}
159
160
rossberg@chromium.org400388e2012-06-06 09:29:22 +0000161SnapshotObjectId HeapProfiler::PushHeapObjectsStatsImpl(OutputStream* stream) {
162 return snapshots_->PushHeapObjectsStats(stream);
jkummerow@chromium.org28faa982012-04-13 09:58:30 +0000163}
164
165
166void HeapProfiler::StopHeapObjectsTrackingImpl() {
167 snapshots_->StopHeapObjectsTracking();
168}
169
whesse@chromium.org2c186ca2010-06-16 11:32:39 +0000170
mmassi@chromium.org7028c052012-06-13 11:51:58 +0000171size_t HeapProfiler::GetMemorySizeUsedByProfiler() {
172 HeapProfiler* profiler = Isolate::Current()->heap_profiler();
173 ASSERT(profiler != NULL);
174 size_t size = profiler->snapshots_->GetUsedMemorySize();
175 return size;
176}
177
178
whesse@chromium.org2c186ca2010-06-16 11:32:39 +0000179int HeapProfiler::GetSnapshotsCount() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000180 HeapProfiler* profiler = Isolate::Current()->heap_profiler();
181 ASSERT(profiler != NULL);
182 return profiler->snapshots_->snapshots()->length();
whesse@chromium.org2c186ca2010-06-16 11:32:39 +0000183}
184
185
186HeapSnapshot* HeapProfiler::GetSnapshot(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000187 HeapProfiler* profiler = Isolate::Current()->heap_profiler();
188 ASSERT(profiler != NULL);
189 return profiler->snapshots_->snapshots()->at(index);
whesse@chromium.org2c186ca2010-06-16 11:32:39 +0000190}
191
192
193HeapSnapshot* HeapProfiler::FindSnapshot(unsigned uid) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000194 HeapProfiler* profiler = Isolate::Current()->heap_profiler();
195 ASSERT(profiler != NULL);
196 return profiler->snapshots_->GetSnapshot(uid);
197}
198
199
erik.corry@gmail.comed49e962012-04-17 11:57:53 +0000200SnapshotObjectId HeapProfiler::GetSnapshotObjectId(Handle<Object> obj) {
201 if (!obj->IsHeapObject())
202 return v8::HeapProfiler::kUnknownObjectId;
203 HeapProfiler* profiler = Isolate::Current()->heap_profiler();
204 ASSERT(profiler != NULL);
205 return profiler->snapshots_->FindObjectId(HeapObject::cast(*obj)->address());
206}
207
208
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000209void HeapProfiler::DeleteAllSnapshots() {
210 HeapProfiler* profiler = Isolate::Current()->heap_profiler();
211 ASSERT(profiler != NULL);
212 profiler->ResetSnapshots();
whesse@chromium.org2c186ca2010-06-16 11:32:39 +0000213}
214
215
ricow@chromium.org4980dff2010-07-19 08:33:45 +0000216void HeapProfiler::ObjectMoveEvent(Address from, Address to) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000217 snapshots_->ObjectMoveEvent(from, to);
ricow@chromium.org4980dff2010-07-19 08:33:45 +0000218}
219
christian.plesner.hansen@gmail.com2bc58ef2009-09-22 10:00:30 +0000220
221} } // namespace v8::internal