< prev index next >

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

Print this page

        

@@ -48,10 +48,12 @@
 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,10 +100,17 @@
   _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,5 +171,34 @@
     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 >