# HG changeset patch # User Haoyu Li # Date 1575363615 -28800 # Tue Dec 03 17:00:15 2019 +0800 # Node ID fbd52e214fa2c9eaa5c66f8f63b69d83020e164e # Parent fa1262fd180c86883401cd90f6f7bd0b9a6483d9 use the ~0 sentinel, delete a line of dead code, and replace MutexLocker with MonitorLocker diff -r fa1262fd180c -r fbd52e214fa2 src/hotspot/share/gc/parallel/psCompactionManager.cpp --- a/src/hotspot/share/gc/parallel/psCompactionManager.cpp Thu Nov 28 21:23:56 2019 +0800 +++ b/src/hotspot/share/gc/parallel/psCompactionManager.cpp Tue Dec 03 17:00:15 2019 +0800 @@ -173,24 +173,25 @@ } size_t ParCompactionManager::pop_shadow_region_mt_safe(PSParallelCompact::RegionData* region_ptr) { + MonitorLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); while (true) { - MutexLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); - if (_shadow_region_array->is_empty()) { - // Check if the corresponding heap region is available now. - // If so, we don't need to get a shadow region anymore, - // and we return 0 to indicate this case - if (region_ptr->claimed()) { - return 0; - } - } else { + 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) { - MutexLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); + 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) { diff -r fa1262fd180c -r fbd52e214fa2 src/hotspot/share/gc/parallel/psCompactionManager.hpp --- a/src/hotspot/share/gc/parallel/psCompactionManager.hpp Thu Nov 28 21:23:56 2019 +0800 +++ b/src/hotspot/share/gc/parallel/psCompactionManager.hpp Tue Dec 03 17:00:15 2019 +0800 @@ -119,6 +119,7 @@ // marking stack and overflow stack directly. public: + static const size_t InvalidShadow = ~0; static size_t pop_shadow_region_mt_safe(PSParallelCompact::RegionData* region_ptr); static void push_shadow_region_mt_safe(size_t shadow_region); static void push_shadow_region(size_t shadow_region); diff -r fa1262fd180c -r fbd52e214fa2 src/hotspot/share/gc/parallel/psParallelCompact.cpp --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp Thu Nov 28 21:23:56 2019 +0800 +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp Tue Dec 03 17:00:15 2019 +0800 @@ -3061,7 +3061,6 @@ void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosure& closure, size_t region_idx) { typedef ParMarkBitMap::IterationStatus IterationStatus; - const size_t RegionSize = ParallelCompactData::RegionSize; ParMarkBitMap* const bitmap = mark_bitmap(); ParallelCompactData& sd = summary_data(); RegionData* const region_ptr = sd.region(region_idx); @@ -3173,10 +3172,10 @@ ParallelCompactData& sd = summary_data(); RegionData* const region_ptr = sd.region(region_idx); size_t shadow_region = cm->pop_shadow_region_mt_safe(region_ptr); - // The zero return value indicates the corresponding heap region is available, + // The InvalidShadow return value indicates the corresponding heap region is available, // so use MoveAndUpdateClosure to fill the normal region. Otherwise, use // MoveAndUpdateShadowClosure to fill the acquired shadow region. - if (shadow_region == 0) { + if (shadow_region == cm->InvalidShadow) { MoveAndUpdateClosure cl(mark_bitmap(), cm, region_idx); region_ptr->shadow_to_normal(); return fill_region(cm, cl, region_idx);