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 
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:

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:
 - 8286580: serviceability/jvmti/vthread/GetSetLocalTest failed with assert: 
Not supported for heap frames

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

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

Reply via email to