hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
changeset 19347 afb416fb8104
parent 19285 0a3b3f115402
child 19548 e81917358076
equal deleted inserted replaced
19346:7a5310d39603 19347:afb416fb8104
  5476 
  5476 
  5477   ResourceMark rm;
  5477   ResourceMark rm;
  5478   HandleMark   hm;
  5478   HandleMark   hm;
  5479 
  5479 
  5480   SequentialSubTasksDone* pst = space->par_seq_tasks();
  5480   SequentialSubTasksDone* pst = space->par_seq_tasks();
  5481   assert(pst->valid(), "Uninitialized use?");
       
  5482 
  5481 
  5483   uint nth_task = 0;
  5482   uint nth_task = 0;
  5484   uint n_tasks  = pst->n_tasks();
  5483   uint n_tasks  = pst->n_tasks();
  5485 
  5484 
  5486   HeapWord *start, *end;
  5485   if (n_tasks > 0) {
  5487   while (!pst->is_task_claimed(/* reference */ nth_task)) {
  5486     assert(pst->valid(), "Uninitialized use?");
  5488     // We claimed task # nth_task; compute its boundaries.
  5487     HeapWord *start, *end;
  5489     if (chunk_top == 0) {  // no samples were taken
  5488     while (!pst->is_task_claimed(/* reference */ nth_task)) {
  5490       assert(nth_task == 0 && n_tasks == 1, "Can have only 1 EdenSpace task");
  5489       // We claimed task # nth_task; compute its boundaries.
  5491       start = space->bottom();
  5490       if (chunk_top == 0) {  // no samples were taken
  5492       end   = space->top();
  5491         assert(nth_task == 0 && n_tasks == 1, "Can have only 1 EdenSpace task");
  5493     } else if (nth_task == 0) {
  5492         start = space->bottom();
  5494       start = space->bottom();
  5493         end   = space->top();
  5495       end   = chunk_array[nth_task];
  5494       } else if (nth_task == 0) {
  5496     } else if (nth_task < (uint)chunk_top) {
  5495         start = space->bottom();
  5497       assert(nth_task >= 1, "Control point invariant");
  5496         end   = chunk_array[nth_task];
  5498       start = chunk_array[nth_task - 1];
  5497       } else if (nth_task < (uint)chunk_top) {
  5499       end   = chunk_array[nth_task];
  5498         assert(nth_task >= 1, "Control point invariant");
  5500     } else {
  5499         start = chunk_array[nth_task - 1];
  5501       assert(nth_task == (uint)chunk_top, "Control point invariant");
  5500         end   = chunk_array[nth_task];
  5502       start = chunk_array[chunk_top - 1];
  5501       } else {
  5503       end   = space->top();
  5502         assert(nth_task == (uint)chunk_top, "Control point invariant");
  5504     }
  5503         start = chunk_array[chunk_top - 1];
  5505     MemRegion mr(start, end);
  5504         end   = space->top();
  5506     // Verify that mr is in space
  5505       }
  5507     assert(mr.is_empty() || space->used_region().contains(mr),
  5506       MemRegion mr(start, end);
  5508            "Should be in space");
  5507       // Verify that mr is in space
  5509     // Verify that "start" is an object boundary
  5508       assert(mr.is_empty() || space->used_region().contains(mr),
  5510     assert(mr.is_empty() || oop(mr.start())->is_oop(),
  5509              "Should be in space");
  5511            "Should be an oop");
  5510       // Verify that "start" is an object boundary
  5512     space->par_oop_iterate(mr, cl);
  5511       assert(mr.is_empty() || oop(mr.start())->is_oop(),
  5513   }
  5512              "Should be an oop");
  5514   pst->all_tasks_completed();
  5513       space->par_oop_iterate(mr, cl);
       
  5514     }
       
  5515     pst->all_tasks_completed();
       
  5516   }
  5515 }
  5517 }
  5516 
  5518 
  5517 void
  5519 void
  5518 CMSParRemarkTask::do_dirty_card_rescan_tasks(
  5520 CMSParRemarkTask::do_dirty_card_rescan_tasks(
  5519   CompactibleFreeListSpace* sp, int i,
  5521   CompactibleFreeListSpace* sp, int i,
  5786 initialize_sequential_subtasks_for_young_gen_rescan(int n_threads) {
  5788 initialize_sequential_subtasks_for_young_gen_rescan(int n_threads) {
  5787   assert(n_threads > 0, "Unexpected n_threads argument");
  5789   assert(n_threads > 0, "Unexpected n_threads argument");
  5788   DefNewGeneration* dng = (DefNewGeneration*)_young_gen;
  5790   DefNewGeneration* dng = (DefNewGeneration*)_young_gen;
  5789 
  5791 
  5790   // Eden space
  5792   // Eden space
  5791   {
  5793   if (!dng->eden()->is_empty()) {
  5792     SequentialSubTasksDone* pst = dng->eden()->par_seq_tasks();
  5794     SequentialSubTasksDone* pst = dng->eden()->par_seq_tasks();
  5793     assert(!pst->valid(), "Clobbering existing data?");
  5795     assert(!pst->valid(), "Clobbering existing data?");
  5794     // Each valid entry in [0, _eden_chunk_index) represents a task.
  5796     // Each valid entry in [0, _eden_chunk_index) represents a task.
  5795     size_t n_tasks = _eden_chunk_index + 1;
  5797     size_t n_tasks = _eden_chunk_index + 1;
  5796     assert(n_tasks == 1 || _eden_chunk_array != NULL, "Error");
  5798     assert(n_tasks == 1 || _eden_chunk_array != NULL, "Error");