--- old/src/hotspot/share/gc/parallel/psCompactionManager.cpp 2019-12-04 16:34:00.308310756 +0100 +++ new/src/hotspot/share/gc/parallel/psCompactionManager.cpp 2019-12-04 16:34:00.104309873 +0100 @@ -49,6 +49,8 @@ ObjectStartArray* ParCompactionManager::_start_array = NULL; ParMarkBitMap* ParCompactionManager::_mark_bitmap = NULL; RegionTaskQueueSet* ParCompactionManager::_region_array = NULL; +GrowableArray* ParCompactionManager::_shadow_region_array = NULL; +Monitor* ParCompactionManager::_shadow_region_monitor = NULL; ParCompactionManager::ParCompactionManager() : _action(CopyAndUpdate) { @@ -99,6 +101,11 @@ "Could not create ParCompactionManager"); assert(ParallelScavengeHeap::heap()->workers().total_workers() != 0, "Not initialized?"); + + _shadow_region_array = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(10, true); + + _shadow_region_monitor = new Monitor(Mutex::barrier, "CompactionManager monitor", + Mutex::_allow_vm_block_flag, Monitor::_safepoint_check_never); } void ParCompactionManager::reset_all_bitmap_query_caches() { @@ -163,3 +170,33 @@ } } while (!region_stack()->is_empty()); } + +size_t ParCompactionManager::pop_shadow_region_mt_safe(PSParallelCompact::RegionData* region_ptr) { + MonitorLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); + while (true) { + if (!_shadow_region_array->is_empty()) { + return _shadow_region_array->pop(); + } + // Check if the corresponding heap region is available now. + // If so, we don't need to get a shadow region anymore, and + // we return InvalidShadow to indicate such a case. + if (region_ptr->claimed()) { + return InvalidShadow; + } + ml.wait(1); + } +} + +void ParCompactionManager::push_shadow_region_mt_safe(size_t shadow_region) { + MonitorLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); + _shadow_region_array->push(shadow_region); + ml.notify(); +} + +void ParCompactionManager::push_shadow_region(size_t shadow_region) { + _shadow_region_array->push(shadow_region); +} + +void ParCompactionManager::remove_all_shadow_regions() { + _shadow_region_array->clear(); +} \ No newline at end of file