| Index: src/heap-profiler.cc
|
| ===================================================================
|
| --- src/heap-profiler.cc (revision 7267)
|
| +++ src/heap-profiler.cc (working copy)
|
| @@ -72,14 +72,14 @@
|
| String* constructor = GetConstructorNameForHeapProfile(
|
| JSObject::cast(js_obj));
|
| // Differentiate Object and Array instances.
|
| - if (fine_grain && (constructor == Heap::Object_symbol() ||
|
| - constructor == Heap::Array_symbol())) {
|
| + if (fine_grain && (constructor == HEAP->Object_symbol() ||
|
| + constructor == HEAP->Array_symbol())) {
|
| return JSObjectsCluster(constructor, obj);
|
| } else {
|
| return JSObjectsCluster(constructor);
|
| }
|
| } else if (obj->IsString()) {
|
| - return JSObjectsCluster(Heap::String_symbol());
|
| + return JSObjectsCluster(HEAP->String_symbol());
|
| } else if (obj->IsJSGlobalPropertyCell()) {
|
| return JSObjectsCluster(JSObjectsCluster::GLOBAL_PROPERTY);
|
| } else if (obj->IsCode() || obj->IsSharedFunctionInfo() || obj->IsScript()) {
|
| @@ -112,10 +112,10 @@
|
| int size = obj->Size();
|
| // If 'properties' and 'elements' are non-empty (thus, non-shared),
|
| // take their size into account.
|
| - if (obj->properties() != Heap::empty_fixed_array()) {
|
| + if (obj->properties() != HEAP->empty_fixed_array()) {
|
| size += obj->properties()->Size();
|
| }
|
| - if (obj->elements() != Heap::empty_fixed_array()) {
|
| + if (obj->elements() != HEAP->empty_fixed_array()) {
|
| size += obj->elements()->Size();
|
| }
|
| // For functions, also account non-empty context and literals sizes.
|
| @@ -174,7 +174,8 @@
|
| HeapStringAllocator allocator;
|
| StringStream stream(&allocator);
|
| cluster.Print(&stream);
|
| - LOG(HeapSampleJSRetainersEvent(
|
| + LOG(ISOLATE,
|
| + HeapSampleJSRetainersEvent(
|
| *(stream.ToCString()), *(retainers.ToCString())));
|
| }
|
| };
|
| @@ -315,8 +316,6 @@
|
| }
|
|
|
|
|
| -HeapProfiler* HeapProfiler::singleton_ = NULL;
|
| -
|
| HeapProfiler::HeapProfiler()
|
| : snapshots_(new HeapSnapshotsCollection()),
|
| next_snapshot_uid_(1) {
|
| @@ -331,8 +330,9 @@
|
|
|
| void HeapProfiler::Setup() {
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
| - if (singleton_ == NULL) {
|
| - singleton_ = new HeapProfiler();
|
| + Isolate* isolate = Isolate::Current();
|
| + if (isolate->heap_profiler() == NULL) {
|
| + isolate->set_heap_profiler(new HeapProfiler());
|
| }
|
| #endif
|
| }
|
| @@ -340,8 +340,9 @@
|
|
|
| void HeapProfiler::TearDown() {
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
| - delete singleton_;
|
| - singleton_ = NULL;
|
| + Isolate* isolate = Isolate::Current();
|
| + delete isolate->heap_profiler();
|
| + isolate->set_heap_profiler(NULL);
|
| #endif
|
| }
|
|
|
| @@ -351,36 +352,38 @@
|
| HeapSnapshot* HeapProfiler::TakeSnapshot(const char* name,
|
| int type,
|
| v8::ActivityControl* control) {
|
| - ASSERT(singleton_ != NULL);
|
| - return singleton_->TakeSnapshotImpl(name, type, control);
|
| + ASSERT(Isolate::Current()->heap_profiler() != NULL);
|
| + return Isolate::Current()->heap_profiler()->TakeSnapshotImpl(name,
|
| + type,
|
| + control);
|
| }
|
|
|
|
|
| HeapSnapshot* HeapProfiler::TakeSnapshot(String* name,
|
| int type,
|
| v8::ActivityControl* control) {
|
| - ASSERT(singleton_ != NULL);
|
| - return singleton_->TakeSnapshotImpl(name, type, control);
|
| + ASSERT(Isolate::Current()->heap_profiler() != NULL);
|
| + return Isolate::Current()->heap_profiler()->TakeSnapshotImpl(name,
|
| + type,
|
| + control);
|
| }
|
|
|
|
|
| void HeapProfiler::DefineWrapperClass(
|
| uint16_t class_id, v8::HeapProfiler::WrapperInfoCallback callback) {
|
| - ASSERT(singleton_ != NULL);
|
| ASSERT(class_id != v8::HeapProfiler::kPersistentHandleNoClassId);
|
| - if (singleton_->wrapper_callbacks_.length() <= class_id) {
|
| - singleton_->wrapper_callbacks_.AddBlock(
|
| - NULL, class_id - singleton_->wrapper_callbacks_.length() + 1);
|
| + if (wrapper_callbacks_.length() <= class_id) {
|
| + wrapper_callbacks_.AddBlock(
|
| + NULL, class_id - wrapper_callbacks_.length() + 1);
|
| }
|
| - singleton_->wrapper_callbacks_[class_id] = callback;
|
| + wrapper_callbacks_[class_id] = callback;
|
| }
|
|
|
|
|
| v8::RetainedObjectInfo* HeapProfiler::ExecuteWrapperClassCallback(
|
| uint16_t class_id, Object** wrapper) {
|
| - ASSERT(singleton_ != NULL);
|
| - if (singleton_->wrapper_callbacks_.length() <= class_id) return NULL;
|
| - return singleton_->wrapper_callbacks_[class_id](
|
| + if (wrapper_callbacks_.length() <= class_id) return NULL;
|
| + return wrapper_callbacks_[class_id](
|
| class_id, Utils::ToLocal(Handle<Object>(wrapper)));
|
| }
|
|
|
| @@ -394,13 +397,13 @@
|
| bool generation_completed = true;
|
| switch (s_type) {
|
| case HeapSnapshot::kFull: {
|
| - Heap::CollectAllGarbage(true);
|
| + HEAP->CollectAllGarbage(true);
|
| HeapSnapshotGenerator generator(result, control);
|
| generation_completed = generator.GenerateSnapshot();
|
| break;
|
| }
|
| case HeapSnapshot::kAggregated: {
|
| - Heap::CollectAllGarbage(true);
|
| + HEAP->CollectAllGarbage(true);
|
| AggregatedHeapSnapshot agg_snapshot;
|
| AggregatedHeapSnapshotGenerator generator(&agg_snapshot);
|
| generator.GenerateSnapshot();
|
| @@ -427,26 +430,28 @@
|
|
|
|
|
| int HeapProfiler::GetSnapshotsCount() {
|
| - ASSERT(singleton_ != NULL);
|
| - return singleton_->snapshots_->snapshots()->length();
|
| + HeapProfiler* profiler = Isolate::Current()->heap_profiler();
|
| + ASSERT(profiler != NULL);
|
| + return profiler->snapshots_->snapshots()->length();
|
| }
|
|
|
|
|
| HeapSnapshot* HeapProfiler::GetSnapshot(int index) {
|
| - ASSERT(singleton_ != NULL);
|
| - return singleton_->snapshots_->snapshots()->at(index);
|
| + HeapProfiler* profiler = Isolate::Current()->heap_profiler();
|
| + ASSERT(profiler != NULL);
|
| + return profiler->snapshots_->snapshots()->at(index);
|
| }
|
|
|
|
|
| HeapSnapshot* HeapProfiler::FindSnapshot(unsigned uid) {
|
| - ASSERT(singleton_ != NULL);
|
| - return singleton_->snapshots_->GetSnapshot(uid);
|
| + HeapProfiler* profiler = Isolate::Current()->heap_profiler();
|
| + ASSERT(profiler != NULL);
|
| + return profiler->snapshots_->GetSnapshot(uid);
|
| }
|
|
|
|
|
| void HeapProfiler::ObjectMoveEvent(Address from, Address to) {
|
| - ASSERT(singleton_ != NULL);
|
| - singleton_->snapshots_->ObjectMoveEvent(from, to);
|
| + snapshots_->ObjectMoveEvent(from, to);
|
| }
|
|
|
|
|
| @@ -464,7 +469,8 @@
|
| HeapStringAllocator allocator;
|
| StringStream stream(&allocator);
|
| cluster.Print(&stream);
|
| - LOG(HeapSampleJSConstructorEvent(*(stream.ToCString()),
|
| + LOG(ISOLATE,
|
| + HeapSampleJSConstructorEvent(*(stream.ToCString()),
|
| number_and_size.number(),
|
| number_and_size.bytes()));
|
| }
|
| @@ -683,7 +689,7 @@
|
| aggregator_(NULL) {
|
| JSObjectsCluster roots(JSObjectsCluster::ROOTS);
|
| ReferencesExtractor extractor(roots, this);
|
| - Heap::IterateRoots(&extractor, VISIT_ONLY_STRONG);
|
| + HEAP->IterateRoots(&extractor, VISIT_ONLY_STRONG);
|
| }
|
|
|
|
|
| @@ -753,15 +759,18 @@
|
| String* constructor = GetConstructorNameForHeapProfile(JSObject::cast(obj));
|
| SmartPointer<char> s_name(
|
| constructor->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL));
|
| - LOG(HeapSampleJSProducerEvent(GetConstructorName(*s_name),
|
| + LOG(ISOLATE,
|
| + HeapSampleJSProducerEvent(GetConstructorName(*s_name),
|
| reinterpret_cast<Address*>(trace)));
|
| }
|
|
|
|
|
| void HeapProfiler::WriteSample() {
|
| - LOG(HeapSampleBeginEvent("Heap", "allocated"));
|
| - LOG(HeapSampleStats(
|
| - "Heap", "allocated", Heap::CommittedMemory(), Heap::SizeOfObjects()));
|
| + Isolate* isolate = Isolate::Current();
|
| + LOG(isolate, HeapSampleBeginEvent("Heap", "allocated"));
|
| + LOG(isolate,
|
| + HeapSampleStats(
|
| + "Heap", "allocated", HEAP->CommittedMemory(), HEAP->SizeOfObjects()));
|
|
|
| AggregatedHeapSnapshot snapshot;
|
| AggregatedHeapSnapshotGenerator generator(&snapshot);
|
| @@ -772,7 +781,8 @@
|
| i <= AggregatedHeapSnapshotGenerator::kAllStringsType;
|
| ++i) {
|
| if (info[i].bytes() > 0) {
|
| - LOG(HeapSampleItemEvent(info[i].name(), info[i].number(),
|
| + LOG(isolate,
|
| + HeapSampleItemEvent(info[i].name(), info[i].number(),
|
| info[i].bytes()));
|
| }
|
| }
|
| @@ -780,10 +790,10 @@
|
| snapshot.js_cons_profile()->PrintStats();
|
| snapshot.js_retainer_profile()->PrintStats();
|
|
|
| - GlobalHandles::IterateWeakRoots(PrintProducerStackTrace,
|
| - StackWeakReferenceCallback);
|
| + isolate->global_handles()->IterateWeakRoots(PrintProducerStackTrace,
|
| + StackWeakReferenceCallback);
|
|
|
| - LOG(HeapSampleEndEvent("Heap", "allocated"));
|
| + LOG(isolate, HeapSampleEndEvent("Heap", "allocated"));
|
| }
|
|
|
|
|
| @@ -1117,8 +1127,6 @@
|
| }
|
|
|
|
|
| -bool ProducerHeapProfile::can_log_ = false;
|
| -
|
| void ProducerHeapProfile::Setup() {
|
| can_log_ = true;
|
| }
|
| @@ -1138,10 +1146,10 @@
|
| stack[i++] = it.frame()->pc();
|
| }
|
| stack[i] = NULL;
|
| - Handle<Object> handle = GlobalHandles::Create(obj);
|
| - GlobalHandles::MakeWeak(handle.location(),
|
| - static_cast<void*>(stack.start()),
|
| - StackWeakReferenceCallback);
|
| + Handle<Object> handle = isolate_->global_handles()->Create(obj);
|
| + isolate_->global_handles()->MakeWeak(handle.location(),
|
| + static_cast<void*>(stack.start()),
|
| + StackWeakReferenceCallback);
|
| }
|
|
|
|
|
|
|