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 |