Mercurial > hg > graal-compiler
comparison src/share/vm/services/virtualMemoryTracker.cpp @ 20553:417e3b8d04c5
8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
Summary: Disallow increasing native memory tracking level
Reviewed-by: hseigel, ctornqvi, gtriantafill
author | coleenp |
---|---|
date | Fri, 10 Oct 2014 19:36:12 +0000 |
parents | 3adc0e278f49 |
children |
comparison
equal
deleted
inserted
replaced
20547:fffbcc20bf61 | 20553:417e3b8d04c5 |
---|---|
441 | 441 |
442 | 442 |
443 bool VirtualMemoryTracker::walk_virtual_memory(VirtualMemoryWalker* walker) { | 443 bool VirtualMemoryTracker::walk_virtual_memory(VirtualMemoryWalker* walker) { |
444 assert(_reserved_regions != NULL, "Sanity check"); | 444 assert(_reserved_regions != NULL, "Sanity check"); |
445 ThreadCritical tc; | 445 ThreadCritical tc; |
446 LinkedListNode<ReservedMemoryRegion>* head = _reserved_regions->head(); | 446 // Check that the _reserved_regions haven't been deleted. |
447 while (head != NULL) { | 447 if (_reserved_regions != NULL) { |
448 const ReservedMemoryRegion* rgn = head->peek(); | 448 LinkedListNode<ReservedMemoryRegion>* head = _reserved_regions->head(); |
449 if (!walker->do_allocation_site(rgn)) { | 449 while (head != NULL) { |
450 return false; | 450 const ReservedMemoryRegion* rgn = head->peek(); |
451 } | 451 if (!walker->do_allocation_site(rgn)) { |
452 head = head->next(); | 452 return false; |
453 } | 453 } |
454 head = head->next(); | |
455 } | |
456 } | |
454 return true; | 457 return true; |
455 } | 458 } |
456 | 459 |
457 // Transition virtual memory tracking level. | 460 // Transition virtual memory tracking level. |
458 bool VirtualMemoryTracker::transition(NMT_TrackingLevel from, NMT_TrackingLevel to) { | 461 bool VirtualMemoryTracker::transition(NMT_TrackingLevel from, NMT_TrackingLevel to) { |
459 if (from == NMT_minimal) { | 462 assert (from != NMT_minimal, "cannot convert from the lowest tracking level to anything"); |
460 assert(to == NMT_summary || to == NMT_detail, "Just check"); | 463 if (to == NMT_minimal) { |
461 VirtualMemorySummary::reset(); | |
462 } else if (to == NMT_minimal) { | |
463 assert(from == NMT_summary || from == NMT_detail, "Just check"); | 464 assert(from == NMT_summary || from == NMT_detail, "Just check"); |
464 // Clean up virtual memory tracking data structures. | 465 // Clean up virtual memory tracking data structures. |
465 ThreadCritical tc; | 466 ThreadCritical tc; |
467 // Check for potential race with other thread calling transition | |
466 if (_reserved_regions != NULL) { | 468 if (_reserved_regions != NULL) { |
467 delete _reserved_regions; | 469 delete _reserved_regions; |
468 _reserved_regions = NULL; | 470 _reserved_regions = NULL; |
469 } | 471 } |
470 } | 472 } |