comparison src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp @ 14305:c685ef164975

8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure Summary: Remove the above mentioned template parameter and related unused code. Also remove some classes that are never used. Reviewed-by: stefank, mgerdin, jwilhelm
author tschatzl
date Mon, 20 Jan 2014 11:47:53 +0100
parents f95d63e2154a
children 63a4eb8bcd23 02e61cf08ab3
comparison
equal deleted inserted replaced
14304:a2866d45e99e 14305:c685ef164975
96 _oc(oc), 96 _oc(oc),
97 _buffer_curr(_buffer), _buffer_top(_buffer + BufferLength), 97 _buffer_curr(_buffer), _buffer_top(_buffer + BufferLength),
98 _closure_app_seconds(0.0) { } 98 _closure_app_seconds(0.0) { }
99 }; 99 };
100 100
101 class BufferingOopsInGenClosure: public OopsInGenClosure {
102 BufferingOopClosure _boc;
103 OopsInGenClosure* _oc;
104 protected:
105 template <class T> inline void do_oop_work(T* p) {
106 assert(generation()->is_in_reserved((void*)p), "Must be in!");
107 _boc.do_oop(p);
108 }
109 public:
110 BufferingOopsInGenClosure(OopsInGenClosure *oc) :
111 _boc(oc), _oc(oc) {}
112
113 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
114 virtual void do_oop(oop* p) { do_oop_work(p); }
115
116 void done() {
117 _boc.done();
118 }
119
120 double closure_app_seconds () {
121 return _boc.closure_app_seconds();
122 }
123
124 void set_generation(Generation* gen) {
125 OopsInGenClosure::set_generation(gen);
126 _oc->set_generation(gen);
127 }
128
129 void reset_generation() {
130 // Make sure we finish the current work with the current generation.
131 _boc.done();
132 OopsInGenClosure::reset_generation();
133 _oc->reset_generation();
134 }
135
136 };
137
138
139 class BufferingOopsInHeapRegionClosure: public OopsInHeapRegionClosure {
140 private:
141 enum PrivateConstants {
142 BufferLength = 1024
143 };
144
145 StarTask _buffer[BufferLength];
146 StarTask* _buffer_top;
147 StarTask* _buffer_curr;
148
149 HeapRegion* _hr_buffer[BufferLength];
150 HeapRegion** _hr_curr;
151
152 OopsInHeapRegionClosure* _oc;
153 double _closure_app_seconds;
154
155 void process_buffer () {
156
157 assert((_hr_curr - _hr_buffer) == (_buffer_curr - _buffer),
158 "the two lengths should be the same");
159
160 double start = os::elapsedTime();
161 HeapRegion** hr_curr = _hr_buffer;
162 HeapRegion* hr_prev = NULL;
163 for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) {
164 HeapRegion* region = *hr_curr;
165 if (region != hr_prev) {
166 _oc->set_region(region);
167 hr_prev = region;
168 }
169 if (curr->is_narrow()) {
170 assert(UseCompressedOops, "Error");
171 _oc->do_oop((narrowOop*)(*curr));
172 } else {
173 _oc->do_oop((oop*)(*curr));
174 }
175 ++hr_curr;
176 }
177 _buffer_curr = _buffer;
178 _hr_curr = _hr_buffer;
179 _closure_app_seconds += (os::elapsedTime() - start);
180 }
181
182 public:
183 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
184 virtual void do_oop( oop* p) { do_oop_work(p); }
185
186 template <class T> void do_oop_work(T* p) {
187 if (_buffer_curr == _buffer_top) {
188 assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr");
189 process_buffer();
190 }
191 StarTask new_ref(p);
192 *_buffer_curr = new_ref;
193 ++_buffer_curr;
194 *_hr_curr = _from;
195 ++_hr_curr;
196 }
197 void done () {
198 if (_buffer_curr > _buffer) {
199 assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr");
200 process_buffer();
201 }
202 }
203 double closure_app_seconds () {
204 return _closure_app_seconds;
205 }
206 BufferingOopsInHeapRegionClosure (OopsInHeapRegionClosure *oc) :
207 _oc(oc),
208 _buffer_curr(_buffer), _buffer_top(_buffer + BufferLength),
209 _hr_curr(_hr_buffer),
210 _closure_app_seconds(0.0) { }
211 };
212
213 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_BUFFERINGOOPCLOSURE_HPP 101 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_BUFFERINGOOPCLOSURE_HPP