1.1 --- a/src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp Fri Jul 10 16:01:20 2009 -0700 1.2 +++ b/src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp Tue Jul 14 15:40:39 2009 -0700 1.3 @@ -42,35 +42,40 @@ 1.4 BufferLength = 1024 1.5 }; 1.6 1.7 - oop *_buffer[BufferLength]; 1.8 - oop **_buffer_top; 1.9 - oop **_buffer_curr; 1.10 + StarTask _buffer[BufferLength]; 1.11 + StarTask* _buffer_top; 1.12 + StarTask* _buffer_curr; 1.13 1.14 - OopClosure *_oc; 1.15 - double _closure_app_seconds; 1.16 + OopClosure* _oc; 1.17 + double _closure_app_seconds; 1.18 1.19 void process_buffer () { 1.20 - 1.21 double start = os::elapsedTime(); 1.22 - for (oop **curr = _buffer; curr < _buffer_curr; ++curr) { 1.23 - _oc->do_oop(*curr); 1.24 + for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) { 1.25 + if (curr->is_narrow()) { 1.26 + assert(UseCompressedOops, "Error"); 1.27 + _oc->do_oop((narrowOop*)(*curr)); 1.28 + } else { 1.29 + _oc->do_oop((oop*)(*curr)); 1.30 + } 1.31 } 1.32 _buffer_curr = _buffer; 1.33 _closure_app_seconds += (os::elapsedTime() - start); 1.34 } 1.35 1.36 -public: 1.37 - virtual void do_oop(narrowOop* p) { 1.38 - guarantee(false, "NYI"); 1.39 - } 1.40 - virtual void do_oop(oop *p) { 1.41 + template <class T> inline void do_oop_work(T* p) { 1.42 if (_buffer_curr == _buffer_top) { 1.43 process_buffer(); 1.44 } 1.45 - 1.46 - *_buffer_curr = p; 1.47 + StarTask new_ref(p); 1.48 + *_buffer_curr = new_ref; 1.49 ++_buffer_curr; 1.50 } 1.51 + 1.52 +public: 1.53 + virtual void do_oop(narrowOop* p) { do_oop_work(p); } 1.54 + virtual void do_oop(oop* p) { do_oop_work(p); } 1.55 + 1.56 void done () { 1.57 if (_buffer_curr > _buffer) { 1.58 process_buffer(); 1.59 @@ -88,18 +93,17 @@ 1.60 class BufferingOopsInGenClosure: public OopsInGenClosure { 1.61 BufferingOopClosure _boc; 1.62 OopsInGenClosure* _oc; 1.63 -public: 1.64 + protected: 1.65 + template <class T> inline void do_oop_work(T* p) { 1.66 + assert(generation()->is_in_reserved((void*)p), "Must be in!"); 1.67 + _boc.do_oop(p); 1.68 + } 1.69 + public: 1.70 BufferingOopsInGenClosure(OopsInGenClosure *oc) : 1.71 _boc(oc), _oc(oc) {} 1.72 1.73 - virtual void do_oop(narrowOop* p) { 1.74 - guarantee(false, "NYI"); 1.75 - } 1.76 - 1.77 - virtual void do_oop(oop* p) { 1.78 - assert(generation()->is_in_reserved(p), "Must be in!"); 1.79 - _boc.do_oop(p); 1.80 - } 1.81 + virtual void do_oop(narrowOop* p) { do_oop_work(p); } 1.82 + virtual void do_oop(oop* p) { do_oop_work(p); } 1.83 1.84 void done() { 1.85 _boc.done(); 1.86 @@ -130,14 +134,14 @@ 1.87 BufferLength = 1024 1.88 }; 1.89 1.90 - oop *_buffer[BufferLength]; 1.91 - oop **_buffer_top; 1.92 - oop **_buffer_curr; 1.93 + StarTask _buffer[BufferLength]; 1.94 + StarTask* _buffer_top; 1.95 + StarTask* _buffer_curr; 1.96 1.97 - HeapRegion *_hr_buffer[BufferLength]; 1.98 - HeapRegion **_hr_curr; 1.99 + HeapRegion* _hr_buffer[BufferLength]; 1.100 + HeapRegion** _hr_curr; 1.101 1.102 - OopsInHeapRegionClosure *_oc; 1.103 + OopsInHeapRegionClosure* _oc; 1.104 double _closure_app_seconds; 1.105 1.106 void process_buffer () { 1.107 @@ -146,15 +150,20 @@ 1.108 "the two lengths should be the same"); 1.109 1.110 double start = os::elapsedTime(); 1.111 - HeapRegion **hr_curr = _hr_buffer; 1.112 - HeapRegion *hr_prev = NULL; 1.113 - for (oop **curr = _buffer; curr < _buffer_curr; ++curr) { 1.114 - HeapRegion *region = *hr_curr; 1.115 + HeapRegion** hr_curr = _hr_buffer; 1.116 + HeapRegion* hr_prev = NULL; 1.117 + for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) { 1.118 + HeapRegion* region = *hr_curr; 1.119 if (region != hr_prev) { 1.120 _oc->set_region(region); 1.121 hr_prev = region; 1.122 } 1.123 - _oc->do_oop(*curr); 1.124 + if (curr->is_narrow()) { 1.125 + assert(UseCompressedOops, "Error"); 1.126 + _oc->do_oop((narrowOop*)(*curr)); 1.127 + } else { 1.128 + _oc->do_oop((oop*)(*curr)); 1.129 + } 1.130 ++hr_curr; 1.131 } 1.132 _buffer_curr = _buffer; 1.133 @@ -163,17 +172,16 @@ 1.134 } 1.135 1.136 public: 1.137 - virtual void do_oop(narrowOop *p) { 1.138 - guarantee(false, "NYI"); 1.139 - } 1.140 + virtual void do_oop(narrowOop* p) { do_oop_work(p); } 1.141 + virtual void do_oop( oop* p) { do_oop_work(p); } 1.142 1.143 - virtual void do_oop(oop *p) { 1.144 + template <class T> void do_oop_work(T* p) { 1.145 if (_buffer_curr == _buffer_top) { 1.146 assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr"); 1.147 process_buffer(); 1.148 } 1.149 - 1.150 - *_buffer_curr = p; 1.151 + StarTask new_ref(p); 1.152 + *_buffer_curr = new_ref; 1.153 ++_buffer_curr; 1.154 *_hr_curr = _from; 1.155 ++_hr_curr;