--- old/src/hotspot/share/runtime/safepoint.cpp Wed Nov 8 08:13:19 2017 +++ new/src/hotspot/share/runtime/safepoint.cpp Wed Nov 8 08:13:18 2017 @@ -203,10 +203,9 @@ unsigned int iterations = 0; { - ThreadsListHandle tlh; - JavaThreadIterator jti(tlh.list()); + JavaThreadIteratorWithHandle jtiwh; #ifdef ASSERT - for (JavaThread *cur = jti.first(); cur != NULL; cur = jti.next()) { + for (; JavaThread *cur = jtiwh.next(); ) { assert(cur->safepoint_state()->is_running(), "Illegal initial state"); // Clear the visited flag to ensure that the critical counts are collected properly. cur->set_visited_for_critical_count(false); @@ -219,7 +218,8 @@ // Iterate through all threads until it have been determined how to stop them all at a safepoint int steps = 0 ; while(still_running > 0) { - for (JavaThread *cur = jti.first(); cur != NULL; cur = jti.next()) { + jtiwh.rewind(); + for (; JavaThread *cur = jtiwh.next(); ) { assert(!cur->is_ConcurrentGC_thread(), "A concurrent GC thread is unexpectly being suspended"); ThreadSafepointState *cur_state = cur->safepoint_state(); if (cur_state->is_running()) { @@ -396,13 +396,9 @@ } // EventSafepointWaitBlocked #ifdef ASSERT - { - // Make sure all the threads were visited. - ThreadsListHandle tlh; - JavaThreadIterator jti(tlh.list()); - for (JavaThread *cur = jti.first(); cur != NULL; cur = jti.next()) { - assert(cur->was_visited_for_critical_count(), "missed a thread"); - } + // Make sure all the threads were visited. + for (JavaThreadIteratorWithHandle jtiwh; JavaThread *cur = jtiwh.next(); ) { + assert(cur->was_visited_for_critical_count(), "missed a thread"); } #endif // ASSERT @@ -460,13 +456,12 @@ } { - ThreadsListHandle tlh; - JavaThreadIterator jti(tlh.list()); + JavaThreadIteratorWithHandle jtiwh; #ifdef ASSERT // A pending_exception cannot be installed during a safepoint. The threads // may install an async exception after they come back from a safepoint into // pending_exception after they unblock. But that should happen later. - for (JavaThread *cur = jti.first(); cur != NULL; cur = jti.next()) { + for (; JavaThread *cur = jtiwh.next(); ) { assert (!(cur->has_pending_exception() && cur->safepoint_state()->is_at_poll_safepoint()), "safepoint installed a pending exception"); @@ -495,7 +490,8 @@ log_debug(safepoint)("Leaving safepoint region"); // Start suspended threads - for (JavaThread *current = jti.first(); current != NULL; current = jti.next()) { + jtiwh.rewind(); + for (; JavaThread *current = jtiwh.next(); ) { // A problem occurring on Solaris is when attempting to restart threads // the first #cpus - 1 go well, but then the VMThread is preempted when we get // to the next one (since it has been running the longest). We then have @@ -909,19 +905,15 @@ tty->print_cr("# SafepointSynchronize::begin: Threads which did not reach the safepoint:"); ThreadSafepointState *cur_state; ResourceMark rm; - { - ThreadsListHandle tlh; - JavaThreadIterator jti(tlh.list()); - for (JavaThread *cur_thread = jti.first(); cur_thread != NULL; cur_thread = jti.next()) { - cur_state = cur_thread->safepoint_state(); + for (JavaThreadIteratorWithHandle jtiwh; JavaThread *cur_thread = jtiwh.next(); ) { + cur_state = cur_thread->safepoint_state(); - if (cur_thread->thread_state() != _thread_blocked && - ((reason == _spinning_timeout && cur_state->is_running()) || - (reason == _blocking_timeout && !cur_state->has_called_back()))) { - tty->print("# "); - cur_thread->print(); - tty->cr(); - } + if (cur_thread->thread_state() != _thread_blocked && + ((reason == _spinning_timeout && cur_state->is_running()) || + (reason == _blocking_timeout && !cur_state->has_called_back()))) { + tty->print("# "); + cur_thread->print(); + tty->cr(); } } tty->print_cr("# SafepointSynchronize::begin: (End of list)"); @@ -1423,9 +1415,7 @@ tty->print_cr("State: %s", (_state == _synchronizing) ? "synchronizing" : "synchronized"); - ThreadsListHandle tlh; - JavaThreadIterator jti(tlh.list()); - for (JavaThread *cur = jti.first(); cur != NULL; cur = jti.next()) { + for (JavaThreadIteratorWithHandle jtiwh; JavaThread *cur = jtiwh.next(); ) { cur->safepoint_state()->print(); } }