diff -r f283f6871336 -r 16999bd91ba6 src/hotspot/share/runtime/vmThread.cpp --- a/src/hotspot/share/runtime/vmThread.cpp Tue Mar 26 07:09:10 2019 -0400 +++ b/src/hotspot/share/runtime/vmThread.cpp Tue Mar 26 12:08:51 2019 +0100 @@ -434,22 +434,35 @@ static VM_None safepointALot_op("SafepointALot"); static VM_Cleanup cleanup_op; -VM_Operation* VMThread::no_op_safepoint(bool check_time) { +class HandshakeALotTC : public ThreadClosure { + public: + virtual void do_thread(Thread* thread) { +#ifdef ASSERT + assert(thread->is_Java_thread(), "must be"); + JavaThread* jt = (JavaThread*)thread; + jt->verify_states_for_handshake(); +#endif + } +}; + +VM_Operation* VMThread::no_op_safepoint() { + // Check for handshakes first since we may need to return a VMop. + if (HandshakeALot) { + HandshakeALotTC haltc; + Handshake::execute(&haltc); + } + // Check for a cleanup before SafepointALot to keep stats correct. + long interval_ms = SafepointTracing::time_since_last_safepoint_ms(); + bool max_time_exceeded = GuaranteedSafepointInterval != 0 && + (interval_ms >= GuaranteedSafepointInterval); + if (max_time_exceeded && SafepointSynchronize::is_cleanup_needed()) { + return &cleanup_op; + } if (SafepointALot) { return &safepointALot_op; } - if (!SafepointSynchronize::is_cleanup_needed()) { - return NULL; - } - if (check_time) { - long interval_ms = SafepointTracing::time_since_last_safepoint_ms(); - bool max_time_exceeded = GuaranteedSafepointInterval != 0 && - (interval_ms > GuaranteedSafepointInterval); - if (!max_time_exceeded) { - return NULL; - } - } - return &cleanup_op; + // Nothing to be done. + return NULL; } void VMThread::loop() { @@ -491,19 +504,22 @@ exit(-1); } - if (timedout && (_cur_vm_operation = VMThread::no_op_safepoint(false)) != NULL) { - MutexUnlockerEx mul(VMOperationQueue_lock, - Mutex::_no_safepoint_check_flag); - // Force a safepoint since we have not had one for at least - // 'GuaranteedSafepointInterval' milliseconds. This will run all - // the clean-up processing that needs to be done regularly at a - // safepoint - SafepointSynchronize::begin(); - #ifdef ASSERT + if (timedout) { + // Have to unlock VMOperationQueue_lock just in case no_op_safepoint() + // has to do a handshake. + MutexUnlockerEx mul(VMOperationQueue_lock, Mutex::_no_safepoint_check_flag); + if ((_cur_vm_operation = VMThread::no_op_safepoint()) != NULL) { + // Force a safepoint since we have not had one for at least + // 'GuaranteedSafepointInterval' milliseconds and we need to clean + // something. This will run all the clean-up processing that needs + // to be done at a safepoint. + SafepointSynchronize::begin(); + #ifdef ASSERT if (GCALotAtAllSafepoints) InterfaceSupport::check_gc_alot(); - #endif - SafepointSynchronize::end(); - _cur_vm_operation = NULL; + #endif + SafepointSynchronize::end(); + _cur_vm_operation = NULL; + } } _cur_vm_operation = _vm_queue->remove_next(); @@ -615,10 +631,9 @@ VMOperationRequest_lock->notify_all(); } - // - // We want to make sure that we get to a safepoint regularly. - // - if ((_cur_vm_operation = VMThread::no_op_safepoint(false)) != NULL) { + // We want to make sure that we get to a safepoint regularly + // even when executing VMops that don't require safepoints. + if ((_cur_vm_operation = VMThread::no_op_safepoint()) != NULL) { HandleMark hm(VMThread::vm_thread()); SafepointSynchronize::begin(); SafepointSynchronize::end();