Mercurial > hg > truffle
comparison src/share/vm/memory/referenceProcessor.cpp @ 4014:bf2d2b8b1726
7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
Summary: Add a new, separate, pointer to the base of the array of discovered reference lists and use this new pointer in places where we iterate over the entire array.
Reviewed-by: ysr, brutisso
author | johnc |
---|---|
date | Mon, 17 Oct 2011 09:57:41 -0700 |
parents | d1bdeef3e3e2 |
children | e7dead7e90af |
comparison
equal
deleted
inserted
replaced
4013:074f0252cc13 | 4014:bf2d2b8b1726 |
---|---|
103 _span = span; | 103 _span = span; |
104 _discovery_is_atomic = atomic_discovery; | 104 _discovery_is_atomic = atomic_discovery; |
105 _discovery_is_mt = mt_discovery; | 105 _discovery_is_mt = mt_discovery; |
106 _num_q = MAX2(1, mt_processing_degree); | 106 _num_q = MAX2(1, mt_processing_degree); |
107 _max_num_q = MAX2(_num_q, mt_discovery_degree); | 107 _max_num_q = MAX2(_num_q, mt_discovery_degree); |
108 _discoveredSoftRefs = NEW_C_HEAP_ARRAY(DiscoveredList, | 108 _discovered_refs = NEW_C_HEAP_ARRAY(DiscoveredList, |
109 _max_num_q * number_of_subclasses_of_ref()); | 109 _max_num_q * number_of_subclasses_of_ref()); |
110 if (_discoveredSoftRefs == NULL) { | 110 if (_discovered_refs == NULL) { |
111 vm_exit_during_initialization("Could not allocated RefProc Array"); | 111 vm_exit_during_initialization("Could not allocated RefProc Array"); |
112 } | 112 } |
113 _discoveredSoftRefs = &_discovered_refs[0]; | |
113 _discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q]; | 114 _discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q]; |
114 _discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q]; | 115 _discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q]; |
115 _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q]; | 116 _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q]; |
116 // Initialized all entries to NULL | 117 |
118 // Initialize all entries to NULL | |
117 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { | 119 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
118 _discoveredSoftRefs[i].set_head(NULL); | 120 _discovered_refs[i].set_head(NULL); |
119 _discoveredSoftRefs[i].set_length(0); | 121 _discovered_refs[i].set_length(0); |
120 } | 122 } |
123 | |
121 // If we do barriers, cache a copy of the barrier set. | 124 // If we do barriers, cache a copy of the barrier set. |
122 if (discovered_list_needs_barrier) { | 125 if (discovered_list_needs_barrier) { |
123 _bs = Universe::heap()->barrier_set(); | 126 _bs = Universe::heap()->barrier_set(); |
124 } | 127 } |
125 setup_policy(false /* default soft ref policy */); | 128 setup_policy(false /* default soft ref policy */); |
127 | 130 |
128 #ifndef PRODUCT | 131 #ifndef PRODUCT |
129 void ReferenceProcessor::verify_no_references_recorded() { | 132 void ReferenceProcessor::verify_no_references_recorded() { |
130 guarantee(!_discovering_refs, "Discovering refs?"); | 133 guarantee(!_discovering_refs, "Discovering refs?"); |
131 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { | 134 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
132 guarantee(_discoveredSoftRefs[i].is_empty(), | 135 guarantee(_discovered_refs[i].is_empty(), |
133 "Found non-empty discovered list"); | 136 "Found non-empty discovered list"); |
134 } | 137 } |
135 } | 138 } |
136 #endif | 139 #endif |
137 | 140 |
138 void ReferenceProcessor::weak_oops_do(OopClosure* f) { | 141 void ReferenceProcessor::weak_oops_do(OopClosure* f) { |
139 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { | 142 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
140 if (UseCompressedOops) { | 143 if (UseCompressedOops) { |
141 f->do_oop((narrowOop*)_discoveredSoftRefs[i].adr_head()); | 144 f->do_oop((narrowOop*)_discovered_refs[i].adr_head()); |
142 } else { | 145 } else { |
143 f->do_oop((oop*)_discoveredSoftRefs[i].adr_head()); | 146 f->do_oop((oop*)_discovered_refs[i].adr_head()); |
144 } | 147 } |
145 } | 148 } |
146 } | 149 } |
147 | 150 |
148 void ReferenceProcessor::update_soft_ref_master_clock() { | 151 void ReferenceProcessor::update_soft_ref_master_clock() { |
421 // Enqueue references that are not made active again | 424 // Enqueue references that are not made active again |
422 void ReferenceProcessor::enqueue_discovered_reflists(HeapWord* pending_list_addr, | 425 void ReferenceProcessor::enqueue_discovered_reflists(HeapWord* pending_list_addr, |
423 AbstractRefProcTaskExecutor* task_executor) { | 426 AbstractRefProcTaskExecutor* task_executor) { |
424 if (_processing_is_mt && task_executor != NULL) { | 427 if (_processing_is_mt && task_executor != NULL) { |
425 // Parallel code | 428 // Parallel code |
426 RefProcEnqueueTask tsk(*this, _discoveredSoftRefs, | 429 RefProcEnqueueTask tsk(*this, _discovered_refs, |
427 pending_list_addr, _max_num_q); | 430 pending_list_addr, _max_num_q); |
428 task_executor->execute(tsk); | 431 task_executor->execute(tsk); |
429 } else { | 432 } else { |
430 // Serial code: call the parent class's implementation | 433 // Serial code: call the parent class's implementation |
431 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { | 434 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
432 enqueue_discovered_reflist(_discoveredSoftRefs[i], pending_list_addr); | 435 enqueue_discovered_reflist(_discovered_refs[i], pending_list_addr); |
433 _discoveredSoftRefs[i].set_head(NULL); | 436 _discovered_refs[i].set_head(NULL); |
434 _discoveredSoftRefs[i].set_length(0); | 437 _discovered_refs[i].set_length(0); |
435 } | 438 } |
436 } | 439 } |
437 } | 440 } |
438 | 441 |
439 void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) { | 442 void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) { |
689 // loop over the lists | 692 // loop over the lists |
690 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { | 693 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
691 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) { | 694 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) { |
692 gclog_or_tty->print_cr("\nAbandoning %s discovered list", list_name(i)); | 695 gclog_or_tty->print_cr("\nAbandoning %s discovered list", list_name(i)); |
693 } | 696 } |
694 abandon_partial_discovered_list(_discoveredSoftRefs[i]); | 697 abandon_partial_discovered_list(_discovered_refs[i]); |
695 } | 698 } |
696 } | 699 } |
697 | 700 |
698 class RefProcPhase1Task: public AbstractRefProcTaskExecutor::ProcessTask { | 701 class RefProcPhase1Task: public AbstractRefProcTaskExecutor::ProcessTask { |
699 public: | 702 public: |
950 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) { | 953 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) { |
951 gclog_or_tty->print_cr( | 954 gclog_or_tty->print_cr( |
952 "\nScrubbing %s discovered list of Null referents", | 955 "\nScrubbing %s discovered list of Null referents", |
953 list_name(i)); | 956 list_name(i)); |
954 } | 957 } |
955 clean_up_discovered_reflist(_discoveredSoftRefs[i]); | 958 clean_up_discovered_reflist(_discovered_refs[i]); |
956 } | 959 } |
957 } | 960 } |
958 | 961 |
959 void ReferenceProcessor::clean_up_discovered_reflist(DiscoveredList& refs_list) { | 962 void ReferenceProcessor::clean_up_discovered_reflist(DiscoveredList& refs_list) { |
960 assert(!discovery_is_atomic(), "Else why call this method?"); | 963 assert(!discovery_is_atomic(), "Else why call this method?"); |
1400 | 1403 |
1401 #ifndef PRODUCT | 1404 #ifndef PRODUCT |
1402 void ReferenceProcessor::clear_discovered_references() { | 1405 void ReferenceProcessor::clear_discovered_references() { |
1403 guarantee(!_discovering_refs, "Discovering refs?"); | 1406 guarantee(!_discovering_refs, "Discovering refs?"); |
1404 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { | 1407 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
1405 clear_discovered_references(_discoveredSoftRefs[i]); | 1408 clear_discovered_references(_discovered_refs[i]); |
1406 } | 1409 } |
1407 } | 1410 } |
1408 | 1411 |
1409 #endif // PRODUCT | 1412 #endif // PRODUCT |