# HG changeset patch # User rkennke # Date 1508215921 -7200 # Tue Oct 17 06:52:01 2017 +0200 # Node ID 529be730101f925f7f5a3dd9b9742ef81f47d7ea # Parent 6218d903d2f25017051fedbddfdbc071d2351c4a 8185580: Refactor Threads::possibly_parallel_oops_do() to use Threads::parallel_java_threads_do() diff --git a/src/hotspot/share/runtime/safepoint.cpp b/src/hotspot/share/runtime/safepoint.cpp --- a/src/hotspot/share/runtime/safepoint.cpp +++ b/src/hotspot/share/runtime/safepoint.cpp @@ -581,7 +581,7 @@ void work(uint worker_id) { // All threads deflate monitors and mark nmethods (if necessary). - Threads::parallel_java_threads_do(&_cleanup_threads_cl); + Threads::possibly_parallel_threads_do(true, &_cleanup_threads_cl); if (!_subtasks.is_task_claimed(SafepointSynchronize::SAFEPOINT_CLEANUP_DEFLATE_MONITORS)) { const char* name = "deflating idle monitors"; diff --git a/src/hotspot/share/runtime/thread.cpp b/src/hotspot/share/runtime/thread.cpp --- a/src/hotspot/share/runtime/thread.cpp +++ b/src/hotspot/share/runtime/thread.cpp @@ -3349,20 +3349,17 @@ // If CompilerThreads ever become non-JavaThreads, add them here } -void Threads::parallel_java_threads_do(ThreadClosure* tc) { +void Threads::possibly_parallel_threads_do(bool is_par, ThreadClosure* tc) { int cp = Threads::thread_claim_parity(); ALL_JAVA_THREADS(p) { - if (p->claim_oops_do(true, cp)) { + if (p->claim_oops_do(is_par, cp)) { tc->do_thread(p); } } - // Thread claiming protocol requires us to claim the same interesting - // threads on all paths. Notably, Threads::possibly_parallel_threads_do - // claims all Java threads *and* the VMThread. To avoid breaking the - // claiming protocol, we have to claim VMThread on this path too, even - // if we do not apply the closure to the VMThread. VMThread* vmt = VMThread::vm_thread(); - (void)vmt->claim_oops_do(true, cp); + if (vmt->claim_oops_do(is_par, cp)) { + tc->do_thread(vmt); + } } // The system initialization in the library has three phases. @@ -4324,17 +4321,20 @@ } #endif // ASSERT +class ParallelOopsDoThreadClosure : public ThreadClosure { +private: + OopClosure* _f; + CodeBlobClosure* _cf; +public: + ParallelOopsDoThreadClosure(OopClosure* f, CodeBlobClosure* cf) : _f(f), _cf(cf) {} + void do_thread(Thread* t) { + t->oops_do(_f, _cf); + } +}; + void Threads::possibly_parallel_oops_do(bool is_par, OopClosure* f, CodeBlobClosure* cf) { - int cp = Threads::thread_claim_parity(); - ALL_JAVA_THREADS(p) { - if (p->claim_oops_do(is_par, cp)) { - p->oops_do(f, cf); - } - } - VMThread* vmt = VMThread::vm_thread(); - if (vmt->claim_oops_do(is_par, cp)) { - vmt->oops_do(f, cf); - } + ParallelOopsDoThreadClosure tc(f, cf); + possibly_parallel_threads_do(is_par, &tc); } #if INCLUDE_ALL_GCS diff --git a/src/hotspot/share/runtime/thread.hpp b/src/hotspot/share/runtime/thread.hpp --- a/src/hotspot/share/runtime/thread.hpp +++ b/src/hotspot/share/runtime/thread.hpp @@ -2052,7 +2052,7 @@ static bool includes(JavaThread* p); static JavaThread* first() { return _thread_list; } static void threads_do(ThreadClosure* tc); - static void parallel_java_threads_do(ThreadClosure* tc); + static void possibly_parallel_threads_do(bool is_par, ThreadClosure* tc); // Initializes the vm and creates the vm thread static jint create_vm(JavaVMInitArgs* args, bool* canTryAgain);