8227117: normal interpreter table is not restored after single stepping with TLH

Reviewed-by: sspitsyn, eosterlund, dholmes, coleenp
This commit is contained in:
Daniel D. Daugherty 2019-07-08 11:38:49 -04:00
parent 259a0b4a7b
commit 37b39bc642
2 changed files with 24 additions and 10 deletions
src/hotspot/share

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -29,6 +29,7 @@
#include "interpreter/templateInterpreter.hpp"
#include "interpreter/templateInterpreterGenerator.hpp"
#include "interpreter/templateTable.hpp"
#include "logging/log.hpp"
#include "memory/resourceArea.hpp"
#include "runtime/timerTrace.hpp"
@ -283,9 +284,13 @@ static inline void copy_table(address* from, address* to, int size) {
void TemplateInterpreter::notice_safepoints() {
if (!_notice_safepoints) {
log_debug(interpreter, safepoint)("switching active_table to safept_table.");
// switch to safepoint dispatch table
_notice_safepoints = true;
copy_table((address*)&_safept_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address));
} else {
log_debug(interpreter, safepoint)("active_table is already safept_table; "
"notice_safepoints() call is no-op.");
}
}
@ -297,10 +302,17 @@ void TemplateInterpreter::notice_safepoints() {
void TemplateInterpreter::ignore_safepoints() {
if (_notice_safepoints) {
if (!JvmtiExport::should_post_single_step()) {
log_debug(interpreter, safepoint)("switching active_table to normal_table.");
// switch to normal dispatch table
_notice_safepoints = false;
copy_table((address*)&_normal_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address));
} else {
log_debug(interpreter, safepoint)("single stepping is still active; "
"ignoring ignore_safepoints() call.");
}
} else {
log_debug(interpreter, safepoint)("active_table is already normal_table; "
"ignore_safepoints() call is no-op.");
}
}

@ -264,7 +264,7 @@ public:
VM_ChangeSingleStep::VM_ChangeSingleStep(bool on)
: _on(on != 0)
: _on(on)
{
}
@ -331,18 +331,20 @@ void JvmtiEventControllerPrivate::set_should_post_single_step(bool on) {
}
// This change must always be occur when at a safepoint.
// Being at a safepoint causes the interpreter to use the
// safepoint dispatch table which we overload to find single
// step points. Just to be sure that it has been set, we
// call notice_safepoints when turning on single stepping.
// When we leave our current safepoint, should_post_single_step
// will be checked by the interpreter, and the table kept
// or changed accordingly.
// When _on == true, we use the safepoint interpreter dispatch table
// to allow us to find the single step points. Otherwise, we switch
// back to the regular interpreter dispatch table.
// Note: We call Interpreter::notice_safepoints() and ignore_safepoints()
// in a VM_Operation to safely make the dispatch table switch. We
// no longer rely on the safepoint mechanism to do any of this work
// for us.
void VM_ChangeSingleStep::doit() {
log_debug(interpreter, safepoint)("changing single step to '%s'", _on ? "on" : "off");
JvmtiEventControllerPrivate::set_should_post_single_step(_on);
if (_on) {
Interpreter::notice_safepoints();
} else {
Interpreter::ignore_safepoints();
}
}