< prev index next >

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

Print this page
rev 57190 : [mq]: shadow-regions.5
rev 57191 : [mq]: shadow-regions.5_to_6


3044 
3045           src_space_id = SpaceId(space_id);
3046           src_space_top = space->top();
3047           const size_t src_region_idx = sd.region(src_cp);
3048           closure.set_source(sd.region_to_addr(src_region_idx));
3049           return src_region_idx;
3050         } else {
3051           assert(src_cp->data_size() == 0, "sanity");
3052         }
3053       }
3054     }
3055   } while (++space_id < last_space_id);
3056 
3057   assert(false, "no source region was found");
3058   return 0;
3059 }
3060 
3061 void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosure& closure, size_t region_idx)
3062 {
3063   typedef ParMarkBitMap::IterationStatus IterationStatus;
3064   const size_t RegionSize = ParallelCompactData::RegionSize;
3065   ParMarkBitMap* const bitmap = mark_bitmap();
3066   ParallelCompactData& sd = summary_data();
3067   RegionData* const region_ptr = sd.region(region_idx);
3068 
3069   // Get the source region and related info.
3070   size_t src_region_idx = region_ptr->source_region();
3071   SpaceId src_space_id = space_id(sd.region_to_addr(src_region_idx));
3072   HeapWord* src_space_top = _space_info[src_space_id].space()->top();
3073   HeapWord* dest_addr = sd.region_to_addr(region_idx);
3074 
3075   closure.set_source(first_src_addr(dest_addr, src_space_id, src_region_idx));
3076 
3077   // Adjust src_region_idx to prepare for decrementing destination counts (the
3078   // destination count is not decremented when a region is copied to itself).
3079   if (src_region_idx == region_idx) {
3080     src_region_idx += 1;
3081   }
3082 
3083   if (bitmap->is_unmarked(closure.source())) {
3084     // The first source word is in the middle of an object; copy the remainder


3156 
3157     // Move to the next source region, possibly switching spaces as well.  All
3158     // args except end_addr may be modified.
3159     src_region_idx = next_src_region(closure, src_space_id, src_space_top,
3160                                      end_addr);
3161   } while (true);
3162 }
3163 
3164 void PSParallelCompact::fill_and_update_region(ParCompactionManager* cm, size_t region_idx)
3165 {
3166   MoveAndUpdateClosure cl(mark_bitmap(), cm, region_idx);
3167   fill_region(cm, cl, region_idx);
3168 }
3169 
3170 void PSParallelCompact::fill_and_update_shadow_region(ParCompactionManager* cm, size_t region_idx)
3171 {
3172   // Get a shadow region first
3173   ParallelCompactData& sd = summary_data();
3174   RegionData* const region_ptr = sd.region(region_idx);
3175   size_t shadow_region = cm->pop_shadow_region_mt_safe(region_ptr);
3176   // The zero return value indicates the corresponding heap region is available,
3177   // so use MoveAndUpdateClosure to fill the normal region. Otherwise, use
3178   // MoveAndUpdateShadowClosure to fill the acquired shadow region.
3179   if (shadow_region == 0) {
3180     MoveAndUpdateClosure cl(mark_bitmap(), cm, region_idx);
3181     region_ptr->shadow_to_normal();
3182     return fill_region(cm, cl, region_idx);
3183   } else {
3184     MoveAndUpdateShadowClosure cl(mark_bitmap(), cm, region_idx, shadow_region);
3185     return fill_region(cm, cl, region_idx);
3186   }
3187 }
3188 
3189 void PSParallelCompact::copy_back(HeapWord *shadow_addr, HeapWord *region_addr)
3190 {
3191   Copy::aligned_conjoint_words(shadow_addr, region_addr, _summary_data.RegionSize);
3192 }
3193 
3194 bool PSParallelCompact::steal_unavailable_region(ParCompactionManager* cm, size_t &region_idx)
3195 {
3196   size_t next = cm->next_shadow_region();
3197   ParallelCompactData& sd = summary_data();
3198   size_t old_new_top = sd.addr_to_region_idx(_space_info[old_space_id].new_top());
3199   uint active_gc_threads = ParallelScavengeHeap::heap()->workers().active_workers();




3044 
3045           src_space_id = SpaceId(space_id);
3046           src_space_top = space->top();
3047           const size_t src_region_idx = sd.region(src_cp);
3048           closure.set_source(sd.region_to_addr(src_region_idx));
3049           return src_region_idx;
3050         } else {
3051           assert(src_cp->data_size() == 0, "sanity");
3052         }
3053       }
3054     }
3055   } while (++space_id < last_space_id);
3056 
3057   assert(false, "no source region was found");
3058   return 0;
3059 }
3060 
3061 void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosure& closure, size_t region_idx)
3062 {
3063   typedef ParMarkBitMap::IterationStatus IterationStatus;

3064   ParMarkBitMap* const bitmap = mark_bitmap();
3065   ParallelCompactData& sd = summary_data();
3066   RegionData* const region_ptr = sd.region(region_idx);
3067 
3068   // Get the source region and related info.
3069   size_t src_region_idx = region_ptr->source_region();
3070   SpaceId src_space_id = space_id(sd.region_to_addr(src_region_idx));
3071   HeapWord* src_space_top = _space_info[src_space_id].space()->top();
3072   HeapWord* dest_addr = sd.region_to_addr(region_idx);
3073 
3074   closure.set_source(first_src_addr(dest_addr, src_space_id, src_region_idx));
3075 
3076   // Adjust src_region_idx to prepare for decrementing destination counts (the
3077   // destination count is not decremented when a region is copied to itself).
3078   if (src_region_idx == region_idx) {
3079     src_region_idx += 1;
3080   }
3081 
3082   if (bitmap->is_unmarked(closure.source())) {
3083     // The first source word is in the middle of an object; copy the remainder


3155 
3156     // Move to the next source region, possibly switching spaces as well.  All
3157     // args except end_addr may be modified.
3158     src_region_idx = next_src_region(closure, src_space_id, src_space_top,
3159                                      end_addr);
3160   } while (true);
3161 }
3162 
3163 void PSParallelCompact::fill_and_update_region(ParCompactionManager* cm, size_t region_idx)
3164 {
3165   MoveAndUpdateClosure cl(mark_bitmap(), cm, region_idx);
3166   fill_region(cm, cl, region_idx);
3167 }
3168 
3169 void PSParallelCompact::fill_and_update_shadow_region(ParCompactionManager* cm, size_t region_idx)
3170 {
3171   // Get a shadow region first
3172   ParallelCompactData& sd = summary_data();
3173   RegionData* const region_ptr = sd.region(region_idx);
3174   size_t shadow_region = cm->pop_shadow_region_mt_safe(region_ptr);
3175   // The InvalidShadow return value indicates the corresponding heap region is available,
3176   // so use MoveAndUpdateClosure to fill the normal region. Otherwise, use
3177   // MoveAndUpdateShadowClosure to fill the acquired shadow region.
3178   if (shadow_region == cm->InvalidShadow) {
3179     MoveAndUpdateClosure cl(mark_bitmap(), cm, region_idx);
3180     region_ptr->shadow_to_normal();
3181     return fill_region(cm, cl, region_idx);
3182   } else {
3183     MoveAndUpdateShadowClosure cl(mark_bitmap(), cm, region_idx, shadow_region);
3184     return fill_region(cm, cl, region_idx);
3185   }
3186 }
3187 
3188 void PSParallelCompact::copy_back(HeapWord *shadow_addr, HeapWord *region_addr)
3189 {
3190   Copy::aligned_conjoint_words(shadow_addr, region_addr, _summary_data.RegionSize);
3191 }
3192 
3193 bool PSParallelCompact::steal_unavailable_region(ParCompactionManager* cm, size_t &region_idx)
3194 {
3195   size_t next = cm->next_shadow_region();
3196   ParallelCompactData& sd = summary_data();
3197   size_t old_new_top = sd.addr_to_region_idx(_space_info[old_space_id].new_top());
3198   uint active_gc_threads = ParallelScavengeHeap::heap()->workers().active_workers();


< prev index next >