hotspot/src/share/vm/utilities/taskqueue.cpp
changeset 1407 9006b01ba3fd
parent 1374 4c24294029a9
child 1623 a0dd9009e992
equal deleted inserted replaced
1406:e5e2b519fc11 1407:9006b01ba3fd
   107            "Terminator may still be in use");
   107            "Terminator may still be in use");
   108     _offered_termination = 0;
   108     _offered_termination = 0;
   109   }
   109   }
   110 }
   110 }
   111 
   111 
   112 bool ChunkTaskQueueWithOverflow::is_empty() {
   112 bool RegionTaskQueueWithOverflow::is_empty() {
   113   return (_chunk_queue.size() == 0) &&
   113   return (_region_queue.size() == 0) &&
   114          (_overflow_stack->length() == 0);
   114          (_overflow_stack->length() == 0);
   115 }
   115 }
   116 
   116 
   117 bool ChunkTaskQueueWithOverflow::stealable_is_empty() {
   117 bool RegionTaskQueueWithOverflow::stealable_is_empty() {
   118   return _chunk_queue.size() == 0;
   118   return _region_queue.size() == 0;
   119 }
   119 }
   120 
   120 
   121 bool ChunkTaskQueueWithOverflow::overflow_is_empty() {
   121 bool RegionTaskQueueWithOverflow::overflow_is_empty() {
   122   return _overflow_stack->length() == 0;
   122   return _overflow_stack->length() == 0;
   123 }
   123 }
   124 
   124 
   125 void ChunkTaskQueueWithOverflow::initialize() {
   125 void RegionTaskQueueWithOverflow::initialize() {
   126   _chunk_queue.initialize();
   126   _region_queue.initialize();
   127   assert(_overflow_stack == 0, "Creating memory leak");
   127   assert(_overflow_stack == 0, "Creating memory leak");
   128   _overflow_stack =
   128   _overflow_stack =
   129     new (ResourceObj::C_HEAP) GrowableArray<ChunkTask>(10, true);
   129     new (ResourceObj::C_HEAP) GrowableArray<RegionTask>(10, true);
   130 }
   130 }
   131 
   131 
   132 void ChunkTaskQueueWithOverflow::save(ChunkTask t) {
   132 void RegionTaskQueueWithOverflow::save(RegionTask t) {
   133   if (TraceChunkTasksQueuing && Verbose) {
   133   if (TraceRegionTasksQueuing && Verbose) {
   134     gclog_or_tty->print_cr("CTQ: save " PTR_FORMAT, t);
   134     gclog_or_tty->print_cr("CTQ: save " PTR_FORMAT, t);
   135   }
   135   }
   136   if(!_chunk_queue.push(t)) {
   136   if(!_region_queue.push(t)) {
   137     _overflow_stack->push(t);
   137     _overflow_stack->push(t);
   138   }
   138   }
   139 }
   139 }
   140 
   140 
   141 // Note that using this method will retrieve all chunks
   141 // Note that using this method will retrieve all regions
   142 // that have been saved but that it will always check
   142 // that have been saved but that it will always check
   143 // the overflow stack.  It may be more efficient to
   143 // the overflow stack.  It may be more efficient to
   144 // check the stealable queue and the overflow stack
   144 // check the stealable queue and the overflow stack
   145 // separately.
   145 // separately.
   146 bool ChunkTaskQueueWithOverflow::retrieve(ChunkTask& chunk_task) {
   146 bool RegionTaskQueueWithOverflow::retrieve(RegionTask& region_task) {
   147   bool result = retrieve_from_overflow(chunk_task);
   147   bool result = retrieve_from_overflow(region_task);
   148   if (!result) {
   148   if (!result) {
   149     result = retrieve_from_stealable_queue(chunk_task);
   149     result = retrieve_from_stealable_queue(region_task);
   150   }
   150   }
   151   if (TraceChunkTasksQueuing && Verbose && result) {
   151   if (TraceRegionTasksQueuing && Verbose && result) {
   152     gclog_or_tty->print_cr("  CTQ: retrieve " PTR_FORMAT, result);
   152     gclog_or_tty->print_cr("  CTQ: retrieve " PTR_FORMAT, result);
   153   }
   153   }
   154   return result;
   154   return result;
   155 }
   155 }
   156 
   156 
   157 bool ChunkTaskQueueWithOverflow::retrieve_from_stealable_queue(
   157 bool RegionTaskQueueWithOverflow::retrieve_from_stealable_queue(
   158                                    ChunkTask& chunk_task) {
   158                                    RegionTask& region_task) {
   159   bool result = _chunk_queue.pop_local(chunk_task);
   159   bool result = _region_queue.pop_local(region_task);
   160   if (TraceChunkTasksQueuing && Verbose) {
   160   if (TraceRegionTasksQueuing && Verbose) {
   161     gclog_or_tty->print_cr("CTQ: retrieve_stealable " PTR_FORMAT, chunk_task);
   161     gclog_or_tty->print_cr("CTQ: retrieve_stealable " PTR_FORMAT, region_task);
   162   }
   162   }
   163   return result;
   163   return result;
   164 }
   164 }
   165 
   165 
   166 bool ChunkTaskQueueWithOverflow::retrieve_from_overflow(
   166 bool
   167                                         ChunkTask& chunk_task) {
   167 RegionTaskQueueWithOverflow::retrieve_from_overflow(RegionTask& region_task) {
   168   bool result;
   168   bool result;
   169   if (!_overflow_stack->is_empty()) {
   169   if (!_overflow_stack->is_empty()) {
   170     chunk_task = _overflow_stack->pop();
   170     region_task = _overflow_stack->pop();
   171     result = true;
   171     result = true;
   172   } else {
   172   } else {
   173     chunk_task = (ChunkTask) NULL;
   173     region_task = (RegionTask) NULL;
   174     result = false;
   174     result = false;
   175   }
   175   }
   176   if (TraceChunkTasksQueuing && Verbose) {
   176   if (TraceRegionTasksQueuing && Verbose) {
   177     gclog_or_tty->print_cr("CTQ: retrieve_stealable " PTR_FORMAT, chunk_task);
   177     gclog_or_tty->print_cr("CTQ: retrieve_stealable " PTR_FORMAT, region_task);
   178   }
   178   }
   179   return result;
   179   return result;
   180 }
   180 }