The JVMTI `SetLocalXXX` requires the target virtual thread suspended at a 
breakpoint or single step event.

This is the relevant statement from the `"Local Variable"` section:

  `The SetLocalXXX functions may be used to set the value of a local variable 
in the topmost frame of a virtual thread suspended at a breakpoint or single 
step event.`

This fix is to return the JVMTI_ERROR_OPAQUE_FRAME in cases when the target 
virtual thread is not at a breakpoint or single step event. In this case the 
assert described in the bug report is avoided:

open/src/hotspot/share/runtime/vframe.cpp:300
# assert(stack_chunk() == __null) failed: Not supported for heap frames 


Also, this is an analysis from Ron (please, see it in the bug report comment):

The problem occurs because the thread is suspended at a safepoint poll on 
return in the oldest thawed frame. The safepoint happens after the frame is 
popped but before it returns to the return barrier, thawing the caller (and so 
the stack looks as if we're in enterSpecial). In that case the virtual thread's 
topmost frame is still frozen on the heap, even though it is mounted.

However, the spec says that a set local operation should succeed for the 
topmost frame of a mounted virtual thread only if the thread is suspended *at a 
breakpoint or a single-step event*, and I don't think we can stop at that 
safepoint in that case.

If so, the fix is simple: if we're trying to set, even if the virtual thread is 
mounted and the depth is zero, if the frame is a heap frame, we should return 
an OPAQUE_FRAME error. The test should be changed as well to accept such an 
error if the thread is suspended not at a breakpoint/single-step. 


Changes GetSetLocalTest test are taken from the repo-loom repository. It was an 
update from Leonid which is needed to reproduce this problem.

The fix was tested with thousands of runs of the GetSetLocalTest on Linux, 
Windows and MacOs.

Will also submit nsk.jvmti and nsk.jdi test runs on mach5.

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

Commit messages:
 - 8286836: Crash in GetSetLocalTest: No support for deferred values in 
continuations

Changes: https://git.openjdk.org/jdk19/pull/41/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk19&pr=41&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8286836
  Stats: 29 lines in 3 files changed: 18 ins; 5 del; 6 mod
  Patch: https://git.openjdk.org/jdk19/pull/41.diff
  Fetch: git fetch https://git.openjdk.org/jdk19 pull/41/head:pull/41

PR: https://git.openjdk.org/jdk19/pull/41

Reply via email to