< 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 >