hotspot/src/share/vm/runtime/synchronizer.cpp
changeset 46474 c872a196b75f
parent 46342 c871e0f8b02a
child 46484 688e3a206b86
equal deleted inserted replaced
46473:d43055e806c9 46474:c872a196b75f
   962   return block;
   962   return block;
   963 }
   963 }
   964 
   964 
   965 
   965 
   966 void ObjectSynchronizer::oops_do(OopClosure* f) {
   966 void ObjectSynchronizer::oops_do(OopClosure* f) {
       
   967   if (MonitorInUseLists) {
       
   968     // When using thread local monitor lists, we only scan the
       
   969     // global used list here (for moribund threads), and
       
   970     // the thread-local monitors in Thread::oops_do().
       
   971     global_used_oops_do(f);
       
   972   } else {
       
   973     global_oops_do(f);
       
   974   }
       
   975 }
       
   976 
       
   977 void ObjectSynchronizer::global_oops_do(OopClosure* f) {
   967   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
   978   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
   968   PaddedEnd<ObjectMonitor> * block =
   979   PaddedEnd<ObjectMonitor> * block =
   969     (PaddedEnd<ObjectMonitor> *)OrderAccess::load_ptr_acquire(&gBlockList);
   980     (PaddedEnd<ObjectMonitor> *)OrderAccess::load_ptr_acquire(&gBlockList);
   970   for (; block != NULL; block = (PaddedEnd<ObjectMonitor> *)next(block)) {
   981   for (; block != NULL; block = (PaddedEnd<ObjectMonitor> *)next(block)) {
   971     assert(block->object() == CHAINMARKER, "must be a block header");
   982     assert(block->object() == CHAINMARKER, "must be a block header");
   972     for (int i = 1; i < _BLOCKSIZE; i++) {
   983     for (int i = 1; i < _BLOCKSIZE; i++) {
   973       ObjectMonitor* mid = (ObjectMonitor *)&block[i];
   984       ObjectMonitor* mid = (ObjectMonitor *)&block[i];
   974       if (mid->object() != NULL) {
   985       if (mid->object() != NULL) {
   975         f->do_oop((oop*)mid->object_addr());
   986         f->do_oop((oop*)mid->object_addr());
   976       }
   987       }
       
   988     }
       
   989   }
       
   990 }
       
   991 
       
   992 void ObjectSynchronizer::global_used_oops_do(OopClosure* f) {
       
   993   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
       
   994   list_oops_do(gOmInUseList, f);
       
   995 }
       
   996 
       
   997 void ObjectSynchronizer::thread_local_used_oops_do(Thread* thread, OopClosure* f) {
       
   998   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
       
   999   list_oops_do(thread->omInUseList, f);
       
  1000 }
       
  1001 
       
  1002 void ObjectSynchronizer::list_oops_do(ObjectMonitor* list, OopClosure* f) {
       
  1003   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
       
  1004   ObjectMonitor* mid;
       
  1005   for (mid = list; mid != NULL; mid = mid->FreeNext) {
       
  1006     if (mid->object() != NULL) {
       
  1007       f->do_oop((oop*)mid->object_addr());
   977     }
  1008     }
   978   }
  1009   }
   979 }
  1010 }
   980 
  1011 
   981 
  1012