Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Side by Side Diff: src/heap-profiler.cc

Issue 242031: Heap profiler: correctly determine equivalence of objects having self-refs. (Closed)
Patch Set: Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/heap-profiler.h ('k') | test/cctest/test-heap-profiler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 js_objects_info_tree_.ForEach(this); 326 js_objects_info_tree_.ForEach(this);
327 } 327 }
328 328
329 329
330 void JSObjectsCluster::Print(StringStream* accumulator) const { 330 void JSObjectsCluster::Print(StringStream* accumulator) const {
331 ASSERT(!is_null()); 331 ASSERT(!is_null());
332 if (constructor_ == FromSpecialCase(ROOTS)) { 332 if (constructor_ == FromSpecialCase(ROOTS)) {
333 accumulator->Add("(roots)"); 333 accumulator->Add("(roots)");
334 } else if (constructor_ == FromSpecialCase(GLOBAL_PROPERTY)) { 334 } else if (constructor_ == FromSpecialCase(GLOBAL_PROPERTY)) {
335 accumulator->Add("(global property)"); 335 accumulator->Add("(global property)");
336 } else if (constructor_ == FromSpecialCase(SELF)) {
337 accumulator->Add("(self)");
336 } else { 338 } else {
337 SmartPointer<char> s_name( 339 SmartPointer<char> s_name(
338 constructor_->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL)); 340 constructor_->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL));
339 accumulator->Add("%s", (*s_name)[0] != '\0' ? *s_name : "(anonymous)"); 341 accumulator->Add("%s", (*s_name)[0] != '\0' ? *s_name : "(anonymous)");
340 if (instance_ != NULL) { 342 if (instance_ != NULL) {
341 accumulator->Add(":%p", static_cast<void*>(instance_)); 343 accumulator->Add(":%p", static_cast<void*>(instance_));
342 } 344 }
343 } 345 }
344 } 346 }
345 347
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 if (a.refs.length() > b.refs.length()) return 1; 388 if (a.refs.length() > b.refs.length()) return 1;
387 for (int i = 0; i < a.refs.length(); ++i) { 389 for (int i = 0; i < a.refs.length(); ++i) {
388 int cmp = JSObjectsCluster::Compare(a.refs[i], b.refs[i]); 390 int cmp = JSObjectsCluster::Compare(a.refs[i], b.refs[i]);
389 if (cmp != 0) return cmp; 391 if (cmp != 0) return cmp;
390 } 392 }
391 return 0; 393 return 0;
392 } 394 }
393 395
394 396
395 ClustersCoarser::ClustersCoarser() 397 ClustersCoarser::ClustersCoarser()
396 : zscope_(DELETE_ON_EXIT), 398 : zscope_(DELETE_ON_EXIT),
397 sim_list_(ClustersCoarser::kInitialSimilarityListCapacity), 399 sim_list_(ClustersCoarser::kInitialSimilarityListCapacity),
398 current_pair_(NULL) { 400 current_pair_(NULL),
401 current_set_(NULL),
402 self_(NULL) {
399 } 403 }
400 404
401 405
402 void ClustersCoarser::Call(const JSObjectsCluster& cluster, 406 void ClustersCoarser::Call(const JSObjectsCluster& cluster,
403 JSObjectsClusterTree* tree) { 407 JSObjectsClusterTree* tree) {
404 if (!cluster.can_be_coarsed()) return; 408 if (!cluster.can_be_coarsed()) return;
405 ClusterBackRefs pair(cluster); 409 ClusterBackRefs pair(cluster);
406 ASSERT(current_pair_ == NULL); 410 ASSERT(current_pair_ == NULL);
407 current_pair_ = &pair; 411 current_pair_ = &pair;
408 current_set_ = new JSObjectsRetainerTree(); 412 current_set_ = new JSObjectsRetainerTree();
413 self_ = &cluster;
409 tree->ForEach(this); 414 tree->ForEach(this);
410 sim_list_.Add(pair); 415 sim_list_.Add(pair);
411 current_pair_ = NULL; 416 current_pair_ = NULL;
412 current_set_ = NULL; 417 current_set_ = NULL;
418 self_ = NULL;
413 } 419 }
414 420
415 421
416 void ClustersCoarser::Call(const JSObjectsCluster& cluster, 422 void ClustersCoarser::Call(const JSObjectsCluster& cluster,
417 const NumberAndSizeInfo& number_and_size) { 423 const NumberAndSizeInfo& number_and_size) {
418 ASSERT(current_pair_ != NULL); 424 ASSERT(current_pair_ != NULL);
419 ASSERT(current_set_ != NULL); 425 ASSERT(current_set_ != NULL);
426 ASSERT(self_ != NULL);
427 JSObjectsRetainerTree::Locator loc;
428 if (JSObjectsCluster::Compare(*self_, cluster) == 0) {
429 current_pair_->refs.Add(JSObjectsCluster(JSObjectsCluster::SELF));
430 return;
431 }
420 JSObjectsCluster eq = GetCoarseEquivalent(cluster); 432 JSObjectsCluster eq = GetCoarseEquivalent(cluster);
421 JSObjectsRetainerTree::Locator loc;
422 if (!eq.is_null()) { 433 if (!eq.is_null()) {
423 if (current_set_->Find(eq, &loc)) return; 434 if (current_set_->Find(eq, &loc)) return;
424 current_pair_->refs.Add(eq); 435 current_pair_->refs.Add(eq);
425 current_set_->Insert(eq, &loc); 436 current_set_->Insert(eq, &loc);
426 } else { 437 } else {
427 current_pair_->refs.Add(cluster); 438 current_pair_->refs.Add(cluster);
428 } 439 }
429 } 440 }
430 441
431 442
432 void ClustersCoarser::Process(JSObjectsRetainerTree* tree) { 443 void ClustersCoarser::Process(JSObjectsRetainerTree* tree) {
433 int last_eq_clusters = -1; 444 int last_eq_clusters = -1;
434 for (int i = 0; i < kMaxPassesCount; ++i) { 445 for (int i = 0; i < kMaxPassesCount; ++i) {
435 sim_list_.Clear(); 446 sim_list_.Clear();
436 const int curr_eq_clusters = DoProcess(tree); 447 const int curr_eq_clusters = DoProcess(tree);
437 // If no new cluster equivalents discovered, abort processing. 448 // If no new cluster equivalents discovered, abort processing.
438 if (last_eq_clusters == curr_eq_clusters) break; 449 if (last_eq_clusters == curr_eq_clusters) break;
439 last_eq_clusters = curr_eq_clusters; 450 last_eq_clusters = curr_eq_clusters;
440 } 451 }
441 } 452 }
442 453
443 454
444 int ClustersCoarser::DoProcess(JSObjectsRetainerTree* tree) { 455 int ClustersCoarser::DoProcess(JSObjectsRetainerTree* tree) {
445 tree->ForEach(this); 456 tree->ForEach(this);
446 // To sort similarity list properly, references list of a cluster is 457 sim_list_.Iterate(ClusterBackRefs::SortRefsIterator);
447 // required to be sorted, thus 'O1 <- A, B' and 'O2 <- B, A' would
448 // be considered equivalent. But we don't sort them explicitly
449 // because we know that they come from a splay tree traversal, so
450 // they are already sorted.
451 sim_list_.Sort(ClusterBackRefsCmp); 458 sim_list_.Sort(ClusterBackRefsCmp);
452 return FillEqualityTree(); 459 return FillEqualityTree();
453 } 460 }
454 461
455 462
456 JSObjectsCluster ClustersCoarser::GetCoarseEquivalent( 463 JSObjectsCluster ClustersCoarser::GetCoarseEquivalent(
457 const JSObjectsCluster& cluster) { 464 const JSObjectsCluster& cluster) {
458 if (!cluster.can_be_coarsed()) return JSObjectsCluster(); 465 if (!cluster.can_be_coarsed()) return JSObjectsCluster();
459 EqualityTree::Locator loc; 466 EqualityTree::Locator loc;
460 return eq_tree_.Find(cluster, &loc) ? loc.value() : JSObjectsCluster(); 467 return eq_tree_.Find(cluster, &loc) ? loc.value() : JSObjectsCluster();
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 js_retainer_profile.PrintStats(); 617 js_retainer_profile.PrintStats();
611 618
612 LOG(HeapSampleEndEvent("Heap", "allocated")); 619 LOG(HeapSampleEndEvent("Heap", "allocated"));
613 } 620 }
614 621
615 622
616 #endif // ENABLE_LOGGING_AND_PROFILING 623 #endif // ENABLE_LOGGING_AND_PROFILING
617 624
618 625
619 } } // namespace v8::internal 626 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap-profiler.h ('k') | test/cctest/test-heap-profiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698