< prev index next >

src/hotspot/share/gc/parallel/psCompactionManager.cpp

Print this page

        

*** 48,57 **** --- 48,59 ---- ParCompactionManager::ObjArrayTaskQueueSet* ParCompactionManager::_objarray_queues = NULL; ObjectStartArray* ParCompactionManager::_start_array = NULL; ParMarkBitMap* ParCompactionManager::_mark_bitmap = NULL; RegionTaskQueueSet* ParCompactionManager::_region_array = NULL; + GrowableArray<size_t >* ParCompactionManager::_shadow_region_array = NULL; + Monitor* ParCompactionManager::_shadow_region_monitor = NULL; ParCompactionManager::ParCompactionManager() : _action(CopyAndUpdate) { ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
*** 98,107 **** --- 100,116 ---- _manager_array[parallel_gc_threads] = new ParCompactionManager(); guarantee(_manager_array[parallel_gc_threads] != NULL, "Could not create ParCompactionManager"); assert(ParallelScavengeHeap::heap()->workers().total_workers() != 0, "Not initialized?"); + + _shadow_region_array = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<size_t >(10, true); + guarantee(_shadow_region_array != NULL, "Could not allocate shadow_region_array"); + + _shadow_region_monitor = new Monitor(Mutex::barrier, "CompactionManager monitor", + Mutex::_allow_vm_block_flag, Monitor::_safepoint_check_never); + guarantee(_shadow_region_monitor != NULL, "Could not allocate shadow_region_monitor"); } void ParCompactionManager::reset_all_bitmap_query_caches() { uint parallel_gc_threads = ParallelScavengeHeap::heap()->workers().total_workers(); for (uint i=0; i<=parallel_gc_threads; i++) {
*** 162,166 **** --- 171,204 ---- while (region_stack()->pop_local(region_index)) { PSParallelCompact::fill_and_update_region(this, region_index); } } while (!region_stack()->is_empty()); } + + size_t ParCompactionManager::acquire_shadow_region(PSParallelCompact::RegionData* region_ptr) { + while (true) { + MutexLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); + if (_shadow_region_array->is_empty()) { + // The corresponding heap region may be available now, + // so we don't need to acquire a shadow region anymore, + // and we return 0 to indicate this case + if (region_ptr->claimed()) { + return 0; + } + } else { + return _shadow_region_array->pop(); + } + } + } + + void ParCompactionManager::release_shadow_region(size_t shadow_region) { + MutexLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); + _shadow_region_array->append(shadow_region); + } + + void ParCompactionManager::enqueue_shadow_region(size_t shadow_region) { + _shadow_region_array->append(shadow_region); + } + + void ParCompactionManager::dequeue_shadow_region() { + _shadow_region_array->clear(); + } \ No newline at end of file
< prev index next >