< prev index next >

src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp

Print this page
rev 8039 : [mq]: simplify


 242       gclog_or_tty->print_cr("[%u] task queue overflow, "
 243                              "moving entries to the global stack",
 244                              _worker_id);
 245     }
 246     move_entries_to_global_stack();
 247 
 248     // this should succeed since, even if we overflow the global
 249     // stack, we should have definitely removed some entries from the
 250     // local queue. So, there must be space on it.
 251     bool success = _task_queue->push(obj);
 252     assert(success, "invariant");
 253   }
 254 
 255   statsOnly( size_t tmp_size = (size_t)_task_queue->size();
 256              if (tmp_size > _local_max_size) {
 257                _local_max_size = tmp_size;
 258              }
 259              ++_local_pushes );
 260 }
 261 
 262 // This determines whether the method below will check both the local
 263 // and global fingers when determining whether to push on the stack a
 264 // gray object (value 1) or whether it will only check the global one
 265 // (value 0). The tradeoffs are that the former will be a bit more
 266 // accurate and possibly push less on the stack, but it might also be
 267 // a little bit slower.
 268 
 269 #define _CHECK_BOTH_FINGERS_      1



 270 
 271 inline void CMTask::deal_with_reference(oop obj) {
 272   if (_cm->verbose_high()) {
 273     gclog_or_tty->print_cr("[%u] we're dealing with reference = "PTR_FORMAT,
 274                            _worker_id, p2i((void*) obj));
 275   }
 276 
 277   ++_refs_reached;
 278 
 279   HeapWord* objAddr = (HeapWord*) obj;
 280   assert(obj->is_oop_or_null(true /* ignore mark word */), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(obj)));
 281   if (_g1h->is_in_g1_reserved(objAddr)) {
 282     assert(obj != NULL, "null check is implicit");
 283     if (!_nextMarkBitMap->isMarked(objAddr)) {
 284       // Only get the containing region if the object is not marked on the
 285       // bitmap (otherwise, it's a waste of time since we won't do
 286       // anything with it).
 287       HeapRegion* hr = _g1h->heap_region_containing_raw(obj);
 288       if (!hr->obj_allocated_since_next_marking(obj)) {
 289         if (_cm->verbose_high()) {
 290           gclog_or_tty->print_cr("[%u] "PTR_FORMAT" is not considered marked",
 291                                  _worker_id, p2i((void*) obj));
 292         }
 293 
 294         // we need to mark it first
 295         if (_cm->par_mark_and_count(obj, hr, _marked_bytes_array, _card_bm)) {
 296           // No OrderAccess:store_load() is needed. It is implicit in the
 297           // CAS done in CMBitMap::parMark() call in the routine above.
 298           HeapWord* global_finger = _cm->finger();
 299 
 300 #if _CHECK_BOTH_FINGERS_
 301           // we will check both the local and global fingers
 302 
 303           if (_finger != NULL && objAddr < _finger) {
 304             if (_cm->verbose_high()) {
 305               gclog_or_tty->print_cr("[%u] below the local finger ("PTR_FORMAT"), "
 306                                      "pushing it", _worker_id, p2i(_finger));
 307             }
 308             push(obj);
 309           } else if (_curr_region != NULL && objAddr < _region_limit) {
 310             // do nothing
 311           } else if (objAddr < global_finger) {













 312             // Notice that the global finger might be moving forward
 313             // concurrently. This is not a problem. In the worst case, we
 314             // mark the object while it is above the global finger and, by
 315             // the time we read the global finger, it has moved forward
 316             // passed this object. In this case, the object will probably
 317             // be visited when a task is scanning the region and will also
 318             // be pushed on the stack. So, some duplicate work, but no
 319             // correctness problems.
 320 
 321             if (_cm->verbose_high()) {
 322               gclog_or_tty->print_cr("[%u] below the global finger "
 323                                      "("PTR_FORMAT"), pushing it",
 324                                      _worker_id, p2i(global_finger));
 325             }
 326             push(obj);
 327           } else {
 328             // do nothing
 329           }
 330 #else // _CHECK_BOTH_FINGERS_
 331           // we will only check the global finger
 332 
 333           if (objAddr < global_finger) {
 334             // see long comment above
 335 
 336             if (_cm->verbose_high()) {
 337               gclog_or_tty->print_cr("[%u] below the global finger "
 338                                      "("PTR_FORMAT"), pushing it",
 339                                      _worker_id, p2i(global_finger));
 340             }
 341             push(obj);
 342           }
 343 #endif // _CHECK_BOTH_FINGERS_
 344         }
 345       }
 346     }
 347   }
 348 }
 349 
 350 inline void ConcurrentMark::markPrev(oop p) {
 351   assert(!_prevMarkBitMap->isMarked((HeapWord*) p), "sanity");
 352   // Note we are overriding the read-only view of the prev map here, via
 353   // the cast.
 354   ((CMBitMap*)_prevMarkBitMap)->mark((HeapWord*) p);
 355 }
 356 
 357 inline void ConcurrentMark::grayRoot(oop obj, size_t word_size,
 358                                      uint worker_id, HeapRegion* hr) {
 359   assert(obj != NULL, "pre-condition");
 360   HeapWord* addr = (HeapWord*) obj;
 361   if (hr == NULL) {
 362     hr = _g1h->heap_region_containing_raw(addr);
 363   } else {




 242       gclog_or_tty->print_cr("[%u] task queue overflow, "
 243                              "moving entries to the global stack",
 244                              _worker_id);
 245     }
 246     move_entries_to_global_stack();
 247 
 248     // this should succeed since, even if we overflow the global
 249     // stack, we should have definitely removed some entries from the
 250     // local queue. So, there must be space on it.
 251     bool success = _task_queue->push(obj);
 252     assert(success, "invariant");
 253   }
 254 
 255   statsOnly( size_t tmp_size = (size_t)_task_queue->size();
 256              if (tmp_size > _local_max_size) {
 257                _local_max_size = tmp_size;
 258              }
 259              ++_local_pushes );
 260 }
 261 
 262 inline void CMTask::deal_with_reference_below_finger(
 263   oop obj, HeapWord* finger, bool is_global_finger)
 264 {
 265   if (_cm->verbose_high()) {
 266     gclog_or_tty->print_cr(
 267       "[%u] below the %s finger (" PTR_FORMAT ") pushing " PTR_FORMAT,
 268       _worker_id, (is_global_finger ? "global" : "local"),
 269       p2i(finger), p2i((void*)obj));
 270   }
 271   push(obj);
 272 }
 273 
 274 inline void CMTask::deal_with_reference(oop obj) {
 275   if (_cm->verbose_high()) {
 276     gclog_or_tty->print_cr("[%u] we're dealing with reference = "PTR_FORMAT,
 277                            _worker_id, p2i((void*) obj));
 278   }
 279 
 280   ++_refs_reached;
 281 
 282   HeapWord* objAddr = (HeapWord*) obj;
 283   assert(obj->is_oop_or_null(true /* ignore mark word */), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(obj)));
 284   if (_g1h->is_in_g1_reserved(objAddr)) {
 285     assert(obj != NULL, "null check is implicit");
 286     if (!_nextMarkBitMap->isMarked(objAddr)) {
 287       // Only get the containing region if the object is not marked on the
 288       // bitmap (otherwise, it's a waste of time since we won't do
 289       // anything with it).
 290       HeapRegion* hr = _g1h->heap_region_containing_raw(obj);
 291       if (!hr->obj_allocated_since_next_marking(obj)) {
 292         if (_cm->verbose_high()) {
 293           gclog_or_tty->print_cr("[%u] "PTR_FORMAT" is not considered marked",
 294                                  _worker_id, p2i((void*) obj));
 295         }
 296 
 297         // we need to mark it first
 298         if (_cm->par_mark_and_count(obj, hr, _marked_bytes_array, _card_bm)) {
 299           // No OrderAccess:store_load() is needed. It is implicit in the
 300           // CAS done in CMBitMap::parMark() call in the routine above.
 301           HeapWord* global_finger = _cm->finger();
 302 
 303           // If we have a current region, check against it first to
 304           // decide whether to push a freshly grey object on the mark
 305           // stack or leave it to the mark bit processor.  The
 306           // tradeoff vs only checking the global finger is that the
 307           // local check will be a bit more accurate and possibly push
 308           // less on the stack, but might also be a little bit slower.
 309           if (_finger != NULL) {
 310             // We have a current region.
 311             assert(_curr_region != NULL, "invariant");
 312             assert(_region_limit != NULL, "invariant");
 313             // If object is before the local finger, push it onto the
 314             // mark stack.  If it's between the local finger and the
 315             // end of the region, leave it to mark bit processing to
 316             // take care of.  Otherwise, check against the global
 317             // finger.
 318             if (objAddr < _finger) {
 319               deal_with_reference_below_finger(obj, _finger, false);
 320               return;
 321             } else if (objAddr < _region_limit) {
 322               return;
 323             }
 324           }
 325           // No current region, or object is after the current region.
 326           // Push onto mark stack if below global finger.
 327           //
 328           // Notice that the global finger might be moving forward
 329           // concurrently. This is not a problem. In the worst case, we
 330           // mark the object while it is above the global finger and, by
 331           // the time we read the global finger, it has moved forward
 332           // passed this object. In this case, the object will probably
 333           // be visited when a task is scanning the region and will also
 334           // be pushed on the stack. So, some duplicate work, but no
 335           // correctness problems.













 336           if (objAddr < global_finger) {
 337             deal_with_reference_below_finger(obj, global_finger, true);







 338           }

 339         }
 340       }
 341     }
 342   }
 343 }
 344 
 345 inline void ConcurrentMark::markPrev(oop p) {
 346   assert(!_prevMarkBitMap->isMarked((HeapWord*) p), "sanity");
 347   // Note we are overriding the read-only view of the prev map here, via
 348   // the cast.
 349   ((CMBitMap*)_prevMarkBitMap)->mark((HeapWord*) p);
 350 }
 351 
 352 inline void ConcurrentMark::grayRoot(oop obj, size_t word_size,
 353                                      uint worker_id, HeapRegion* hr) {
 354   assert(obj != NULL, "pre-condition");
 355   HeapWord* addr = (HeapWord*) obj;
 356   if (hr == NULL) {
 357     hr = _g1h->heap_region_containing_raw(addr);
 358   } else {


< prev index next >