4256 }
4257
4258 void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
4259 _drain_in_progress = false;
4260 set_evac_failure_closure(cl);
4261 _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
4262 }
4263
4264 void G1CollectedHeap::finalize_for_evac_failure() {
4265 assert(_evac_failure_scan_stack != NULL &&
4266 _evac_failure_scan_stack->length() == 0,
4267 "Postcondition");
4268 assert(!_drain_in_progress, "Postcondition");
4269 delete _evac_failure_scan_stack;
4270 _evac_failure_scan_stack = NULL;
4271 }
4272
4273 void G1CollectedHeap::remove_self_forwarding_pointers() {
4274 double remove_self_forwards_start = os::elapsedTime();
4275
4276 G1ParRemoveSelfForwardPtrsTask rsfp_task(this);
4277 workers()->run_task(&rsfp_task);
4278
4279 // Now restore saved marks, if any.
4280 assert(_objs_with_preserved_marks.size() ==
4281 _preserved_marks_of_objs.size(), "Both or none.");
4282 while (!_objs_with_preserved_marks.is_empty()) {
4283 oop obj = _objs_with_preserved_marks.pop();
4284 markOop m = _preserved_marks_of_objs.pop();
4285 obj->set_mark(m);
4286 }
4287 _objs_with_preserved_marks.clear(true);
4288 _preserved_marks_of_objs.clear(true);
4289
4290 g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
4291 }
4292
4293 void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
4294 _evac_failure_scan_stack->push(obj);
4295 }
4296
|
4256 }
4257
4258 void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
4259 _drain_in_progress = false;
4260 set_evac_failure_closure(cl);
4261 _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
4262 }
4263
4264 void G1CollectedHeap::finalize_for_evac_failure() {
4265 assert(_evac_failure_scan_stack != NULL &&
4266 _evac_failure_scan_stack->length() == 0,
4267 "Postcondition");
4268 assert(!_drain_in_progress, "Postcondition");
4269 delete _evac_failure_scan_stack;
4270 _evac_failure_scan_stack = NULL;
4271 }
4272
4273 void G1CollectedHeap::remove_self_forwarding_pointers() {
4274 double remove_self_forwards_start = os::elapsedTime();
4275
4276 G1ParRemoveSelfForwardPtrsTask rsfp_task;
4277 workers()->run_task(&rsfp_task);
4278
4279 // Now restore saved marks, if any.
4280 assert(_objs_with_preserved_marks.size() ==
4281 _preserved_marks_of_objs.size(), "Both or none.");
4282 while (!_objs_with_preserved_marks.is_empty()) {
4283 oop obj = _objs_with_preserved_marks.pop();
4284 markOop m = _preserved_marks_of_objs.pop();
4285 obj->set_mark(m);
4286 }
4287 _objs_with_preserved_marks.clear(true);
4288 _preserved_marks_of_objs.clear(true);
4289
4290 g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
4291 }
4292
4293 void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
4294 _evac_failure_scan_stack->push(obj);
4295 }
4296
|