Greetings, Robbin recently discovered this issue with Thread Local Handshakes. Since he's not available at the moment, I'm handling the issue:
JDK-8227117 normal interpreter table is not restored after single stepping with TLH
https://bugs.openjdk.java.net/browse/JDK-8227117 When using Thread Local Handshakes, the normal interpreter table is not restored after single stepping. This issue is caused by the VM_ChangeSingleStep VM-op relying on SafepointSynchronize::end() to restore the normal interpreter table for the "off" case. Prior to Thread Local Handshakes, this was a valid assumption to make. SafepointSynchronize::end() has been refactored into disarm_safepoint() and it only calls Interpreter::ignore_safepoints() on the global safepoint branch. That matches up with the call to Interpreter::notice_safepoints() that is also on the global safepoint branch. The solution is for the VM_ChangeSingleStep VM-op for the "off" case to call Interpreter::ignore_safepoints() directly. Here's the webrev URL: http://cr.openjdk.java.net/~dcubed/8227117-webrev/0_for_jdk14/ The fix is just a small addition to VM_ChangeSingleStep::doit(): if (_on) { Interpreter::notice_safepoints(); + } else { + Interpreter::ignore_safepoints(); } Everything else is just new logging support for future debugging of interpreter table management and single stepping. Tested this fix with Mach5 Tier[1-3] on the standard Oracle platforms. Mach5 Tier[4-6] on standard Oracle platforms is running now. Thanks, in advance, for questions, comments or suggestions. Dan