On Mon, 5 Sep 2022 12:39:41 GMT, Adam Sotona <asot...@openjdk.org> wrote:

> LocalExecutionControl in jdk.jshell actually uses Thread::stop to cancel 
> execution of (long-running or infinite loops) user code in JShell, however 
> Thread::stop is deprecated and planned for removal.
> 
> Proposed patch instruments all user code to call 
> LocalExecutionControl::stopCheck method before every branch instruction.
> Thread::stop call is replaced by setting global field 
> LocalExecutionControl.allStop to true and stopCheck method then throws 
> ThreadDead when called from the instrumented code.
> 
> Proposed patch requires jdk.jshell access to java.base 
> jdk.internal.org.objectweb.asm package. 
> 
> Please review.
> 
> Thanks,
> Adam

This is the last usage of Thread.stop in the JDK so this change is welcome.

The instrumentation to check a flag at jump instrumentation looks reasonable, 
and works here because the method is public on a public class in an exported 
package. I hadn't noticed that jdk.jshell.execution is exported and the 
addition to LocalExecutionControl means it's a new API so I assume forces you 
to write javadoc.

If a user presses control-C in jshell does it also interrupt the thread or will 
it just set the stop flag? If it also interrupts then you have another choice 
to check the interrupt status (assumes all code is well behaved of course).

Is there one or many LocalExecutionControl objects when I execute a snippet, 
control-C, execute another? I'm wondering because the allStop flag is static 
but STOP_LOCK is per instance.

-------------

PR: https://git.openjdk.org/jdk/pull/10166

Reply via email to