# HG changeset patch # User rkennke # Date 1494496867 -7200 # Thu May 11 12:01:07 2017 +0200 # Node ID 4038129566dbee7c893d1040eff3564d6d2f2f30 # Parent 74fad78c5957ba3fe3c8b4a5ac434a9e93872e9f 8180175: ObjectSynchronizer only needs to iterate in-use monitors diff --git a/src/share/vm/runtime/synchronizer.cpp b/src/share/vm/runtime/synchronizer.cpp --- a/src/share/vm/runtime/synchronizer.cpp +++ b/src/share/vm/runtime/synchronizer.cpp @@ -964,6 +964,14 @@ void ObjectSynchronizer::oops_do(OopClosure* f) { + if (MonitorInUseLists) { + global_used_oops_do(f); + } else { + global_oops_do(f); + } +} + +void ObjectSynchronizer::global_oops_do(OopClosure* f) { assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); PaddedEnd * block = (PaddedEnd *)OrderAccess::load_ptr_acquire(&gBlockList); @@ -978,6 +986,26 @@ } } +void ObjectSynchronizer::global_used_oops_do(OopClosure* f) { + assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); + list_oops_do(gOmInUseList, f); +} + +void ObjectSynchronizer::thread_local_used_oops_do(Thread* thread, OopClosure* f) { + assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); + list_oops_do(thread->omInUseList, f); +} + +void ObjectSynchronizer::list_oops_do(ObjectMonitor* list, OopClosure* f) { + assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); + ObjectMonitor* mid; + for (mid = list; mid != NULL; mid = mid->FreeNext) { + if (mid->object() != NULL) { + f->do_oop((oop*)mid->object_addr()); + } + } +} + // ----------------------------------------------------------------------------- // ObjectMonitor Lifecycle diff --git a/src/share/vm/runtime/synchronizer.hpp b/src/share/vm/runtime/synchronizer.hpp --- a/src/share/vm/runtime/synchronizer.hpp +++ b/src/share/vm/runtime/synchronizer.hpp @@ -136,6 +136,7 @@ ObjectMonitor** freeHeadp, ObjectMonitor** freeTailp); static void oops_do(OopClosure* f); + static void thread_local_used_oops_do(Thread* thread, OopClosure* f); // debugging static void sanity_checks(const bool verbose, @@ -156,6 +157,11 @@ static ObjectMonitor * volatile gOmInUseList; // count of entries in gOmInUseList static int gOmInUseCount; + + static void global_oops_do(OopClosure* f); + static void global_used_oops_do(OopClosure* f); + static void list_oops_do(ObjectMonitor* list, OopClosure* f); + }; // ObjectLocker enforced balanced locking and can never thrown an diff --git a/src/share/vm/runtime/thread.cpp b/src/share/vm/runtime/thread.cpp --- a/src/share/vm/runtime/thread.cpp +++ b/src/share/vm/runtime/thread.cpp @@ -792,6 +792,10 @@ // Do oop for ThreadShadow f->do_oop((oop*)&_pending_exception); handle_area()->oops_do(f); + + if (MonitorInUseLists) { + ObjectSynchronizer::thread_local_used_oops_do(this, f); + } } void Thread::metadata_handles_do(void f(Metadata*)) {