1.1 --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Fri Apr 11 09:56:35 2008 -0400 1.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Sun Apr 13 17:43:42 2008 -0400 1.3 @@ -81,14 +81,14 @@ 1.4 #endif // #ifdef ASSERT 1.5 1.6 #ifdef VALIDATE_MARK_SWEEP 1.7 -GrowableArray<oop*>* PSParallelCompact::_root_refs_stack = NULL; 1.8 +GrowableArray<void*>* PSParallelCompact::_root_refs_stack = NULL; 1.9 GrowableArray<oop> * PSParallelCompact::_live_oops = NULL; 1.10 GrowableArray<oop> * PSParallelCompact::_live_oops_moved_to = NULL; 1.11 GrowableArray<size_t>* PSParallelCompact::_live_oops_size = NULL; 1.12 size_t PSParallelCompact::_live_oops_index = 0; 1.13 size_t PSParallelCompact::_live_oops_index_at_perm = 0; 1.14 -GrowableArray<oop*>* PSParallelCompact::_other_refs_stack = NULL; 1.15 -GrowableArray<oop*>* PSParallelCompact::_adjusted_pointers = NULL; 1.16 +GrowableArray<void*>* PSParallelCompact::_other_refs_stack = NULL; 1.17 +GrowableArray<void*>* PSParallelCompact::_adjusted_pointers = NULL; 1.18 bool PSParallelCompact::_pointer_tracking = false; 1.19 bool PSParallelCompact::_root_tracking = true; 1.20 1.21 @@ -811,46 +811,23 @@ 1.22 ParallelCompactData PSParallelCompact::_summary_data; 1.23 1.24 PSParallelCompact::IsAliveClosure PSParallelCompact::_is_alive_closure; 1.25 + 1.26 +void PSParallelCompact::IsAliveClosure::do_object(oop p) { ShouldNotReachHere(); } 1.27 +bool PSParallelCompact::IsAliveClosure::do_object_b(oop p) { return mark_bitmap()->is_marked(p); } 1.28 + 1.29 +void PSParallelCompact::KeepAliveClosure::do_oop(oop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); } 1.30 +void PSParallelCompact::KeepAliveClosure::do_oop(narrowOop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); } 1.31 + 1.32 PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_root_pointer_closure(true); 1.33 PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_pointer_closure(false); 1.34 1.35 -void PSParallelCompact::KeepAliveClosure::do_oop(oop* p) { 1.36 -#ifdef VALIDATE_MARK_SWEEP 1.37 - if (ValidateMarkSweep) { 1.38 - if (!Universe::heap()->is_in_reserved(p)) { 1.39 - _root_refs_stack->push(p); 1.40 - } else { 1.41 - _other_refs_stack->push(p); 1.42 - } 1.43 - } 1.44 -#endif 1.45 - mark_and_push(_compaction_manager, p); 1.46 -} 1.47 - 1.48 -void PSParallelCompact::mark_and_follow(ParCompactionManager* cm, 1.49 - oop* p) { 1.50 - assert(Universe::heap()->is_in_reserved(p), 1.51 - "we should only be traversing objects here"); 1.52 - oop m = *p; 1.53 - if (m != NULL && mark_bitmap()->is_unmarked(m)) { 1.54 - if (mark_obj(m)) { 1.55 - m->follow_contents(cm); // Follow contents of the marked object 1.56 - } 1.57 - } 1.58 -} 1.59 - 1.60 -// Anything associated with this variable is temporary. 1.61 - 1.62 -void PSParallelCompact::mark_and_push_internal(ParCompactionManager* cm, 1.63 - oop* p) { 1.64 - // Push marked object, contents will be followed later 1.65 - oop m = *p; 1.66 - if (mark_obj(m)) { 1.67 - // This thread marked the object and 1.68 - // owns the subsequent processing of it. 1.69 - cm->save_for_scanning(m); 1.70 - } 1.71 -} 1.72 +void PSParallelCompact::AdjustPointerClosure::do_oop(oop* p) { adjust_pointer(p, _is_root); } 1.73 +void PSParallelCompact::AdjustPointerClosure::do_oop(narrowOop* p) { adjust_pointer(p, _is_root); } 1.74 + 1.75 +void PSParallelCompact::FollowStackClosure::do_void() { follow_stack(_compaction_manager); } 1.76 + 1.77 +void PSParallelCompact::MarkAndPushClosure::do_oop(oop* p) { mark_and_push(_compaction_manager, p); } 1.78 +void PSParallelCompact::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(_compaction_manager, p); } 1.79 1.80 void PSParallelCompact::post_initialize() { 1.81 ParallelScavengeHeap* heap = gc_heap(); 1.82 @@ -2751,23 +2728,6 @@ 1.83 young_gen->move_and_update(cm); 1.84 } 1.85 1.86 -void PSParallelCompact::follow_root(ParCompactionManager* cm, oop* p) { 1.87 - assert(!Universe::heap()->is_in_reserved(p), 1.88 - "roots shouldn't be things within the heap"); 1.89 -#ifdef VALIDATE_MARK_SWEEP 1.90 - if (ValidateMarkSweep) { 1.91 - guarantee(!_root_refs_stack->contains(p), "should only be in here once"); 1.92 - _root_refs_stack->push(p); 1.93 - } 1.94 -#endif 1.95 - oop m = *p; 1.96 - if (m != NULL && mark_bitmap()->is_unmarked(m)) { 1.97 - if (mark_obj(m)) { 1.98 - m->follow_contents(cm); // Follow contents of the marked object 1.99 - } 1.100 - } 1.101 - follow_stack(cm); 1.102 -} 1.103 1.104 void PSParallelCompact::follow_stack(ParCompactionManager* cm) { 1.105 while(!cm->overflow_stack()->is_empty()) { 1.106 @@ -2807,7 +2767,7 @@ 1.107 1.108 #ifdef VALIDATE_MARK_SWEEP 1.109 1.110 -void PSParallelCompact::track_adjusted_pointer(oop* p, oop newobj, bool isroot) { 1.111 +void PSParallelCompact::track_adjusted_pointer(void* p, bool isroot) { 1.112 if (!ValidateMarkSweep) 1.113 return; 1.114 1.115 @@ -2821,7 +2781,7 @@ 1.116 if (index != -1) { 1.117 int l = _root_refs_stack->length(); 1.118 if (l > 0 && l - 1 != index) { 1.119 - oop* last = _root_refs_stack->pop(); 1.120 + void* last = _root_refs_stack->pop(); 1.121 assert(last != p, "should be different"); 1.122 _root_refs_stack->at_put(index, last); 1.123 } else { 1.124 @@ -2832,7 +2792,7 @@ 1.125 } 1.126 1.127 1.128 -void PSParallelCompact::check_adjust_pointer(oop* p) { 1.129 +void PSParallelCompact::check_adjust_pointer(void* p) { 1.130 _adjusted_pointers->push(p); 1.131 } 1.132 1.133 @@ -2840,7 +2800,8 @@ 1.134 class AdjusterTracker: public OopClosure { 1.135 public: 1.136 AdjusterTracker() {}; 1.137 - void do_oop(oop* o) { PSParallelCompact::check_adjust_pointer(o); } 1.138 + void do_oop(oop* o) { PSParallelCompact::check_adjust_pointer(o); } 1.139 + void do_oop(narrowOop* o) { PSParallelCompact::check_adjust_pointer(o); } 1.140 }; 1.141 1.142 1.143 @@ -2948,25 +2909,6 @@ 1.144 } 1.145 #endif //VALIDATE_MARK_SWEEP 1.146 1.147 -void PSParallelCompact::adjust_pointer(oop* p, bool isroot) { 1.148 - oop obj = *p; 1.149 - VALIDATE_MARK_SWEEP_ONLY(oop saved_new_pointer = NULL); 1.150 - if (obj != NULL) { 1.151 - oop new_pointer = (oop) summary_data().calc_new_pointer(obj); 1.152 - assert(new_pointer != NULL || // is forwarding ptr? 1.153 - obj->is_shared(), // never forwarded? 1.154 - "should have a new location"); 1.155 - // Just always do the update unconditionally? 1.156 - if (new_pointer != NULL) { 1.157 - *p = new_pointer; 1.158 - assert(Universe::heap()->is_in_reserved(new_pointer), 1.159 - "should be in object space"); 1.160 - VALIDATE_MARK_SWEEP_ONLY(saved_new_pointer = new_pointer); 1.161 - } 1.162 - } 1.163 - VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, saved_new_pointer, isroot)); 1.164 -} 1.165 - 1.166 // Update interior oops in the ranges of chunks [beg_chunk, end_chunk). 1.167 void 1.168 PSParallelCompact::update_and_deadwood_in_dense_prefix(ParCompactionManager* cm,