1297 ShenandoahHeapIterationRootScanner rp;
1298 ObjectIterateScanRootClosure oops(&_aux_bit_map, &oop_stack);
1299
1300 rp.roots_do(&oops);
1301
1302 // Work through the oop stack to traverse heap.
1303 while (! oop_stack.is_empty()) {
1304 oop obj = oop_stack.pop();
1305 assert(oopDesc::is_oop(obj), "must be a valid oop");
1306 cl->do_object(obj);
1307 obj->oop_iterate(&oops);
1308 }
1309
1310 assert(oop_stack.is_empty(), "should be empty");
1311
1312 if (!_aux_bitmap_region_special && !os::uncommit_memory((char*)_aux_bitmap_region.start(), _aux_bitmap_region.byte_size())) {
1313 log_warning(gc)("Could not uncommit native memory for auxiliary marking bitmap for heap iteration");
1314 }
1315 }
1316
1317 // Keep alive an object that was loaded with AS_NO_KEEPALIVE.
1318 void ShenandoahHeap::keep_alive(oop obj) {
1319 if (is_concurrent_mark_in_progress()) {
1320 ShenandoahBarrierSet::barrier_set()->enqueue(obj);
1321 }
1322 }
1323
1324 void ShenandoahHeap::heap_region_iterate(ShenandoahHeapRegionClosure* blk) const {
1325 for (size_t i = 0; i < num_regions(); i++) {
1326 ShenandoahHeapRegion* current = get_region(i);
1327 blk->heap_region_do(current);
1328 }
1329 }
1330
1331 class ShenandoahParallelHeapRegionTask : public AbstractGangTask {
1332 private:
1333 ShenandoahHeap* const _heap;
1334 ShenandoahHeapRegionClosure* const _blk;
1335
1336 shenandoah_padding(0);
|
1297 ShenandoahHeapIterationRootScanner rp;
1298 ObjectIterateScanRootClosure oops(&_aux_bit_map, &oop_stack);
1299
1300 rp.roots_do(&oops);
1301
1302 // Work through the oop stack to traverse heap.
1303 while (! oop_stack.is_empty()) {
1304 oop obj = oop_stack.pop();
1305 assert(oopDesc::is_oop(obj), "must be a valid oop");
1306 cl->do_object(obj);
1307 obj->oop_iterate(&oops);
1308 }
1309
1310 assert(oop_stack.is_empty(), "should be empty");
1311
1312 if (!_aux_bitmap_region_special && !os::uncommit_memory((char*)_aux_bitmap_region.start(), _aux_bitmap_region.byte_size())) {
1313 log_warning(gc)("Could not uncommit native memory for auxiliary marking bitmap for heap iteration");
1314 }
1315 }
1316
1317 void ShenandoahHeap::run_task(AbstractGangTask* task) {
1318 workers()->run_task(task, workers()->active_workers());
1319 }
1320
1321 // Keep alive an object that was loaded with AS_NO_KEEPALIVE.
1322 void ShenandoahHeap::keep_alive(oop obj) {
1323 if (is_concurrent_mark_in_progress()) {
1324 ShenandoahBarrierSet::barrier_set()->enqueue(obj);
1325 }
1326 }
1327
1328 void ShenandoahHeap::heap_region_iterate(ShenandoahHeapRegionClosure* blk) const {
1329 for (size_t i = 0; i < num_regions(); i++) {
1330 ShenandoahHeapRegion* current = get_region(i);
1331 blk->heap_region_do(current);
1332 }
1333 }
1334
1335 class ShenandoahParallelHeapRegionTask : public AbstractGangTask {
1336 private:
1337 ShenandoahHeap* const _heap;
1338 ShenandoahHeapRegionClosure* const _blk;
1339
1340 shenandoah_padding(0);
|