On Tue, 21 Oct 2025 16:00:49 GMT, Jorn Vernee <[email protected]> wrote:

> See the JBS issue for a problem description.
> 
> This patch changes the shared scope closure handshake to be able to handle 
> 'arbitrary' Java frames on the stack during a scoped memory access.
> 
> For the purposes of this change, we assume that 'arbitrary' is limited to the 
> following: 
> 1. Frames added by calling the constructor of `InternalError` as a result of 
> a faulting access to a truncated memory-mapped file (see 
> `HandshakeState::handle_unsafe_access_error`). This is the only handshake 
> operation (i.e. may be triggered during a scoped access) that calls back into 
> Java.
> 2. Frames added by a JVMTI agent that calls back into Java code while 
> handling a JVMTI event that happens during a scoped access.
> 3. Any other Java code that runs as part of the linking process.
> 
> For (1), we set a flag while we are create the `InternalError`. If a thread 
> has that flag set, we know it is in the process of crashing already, so we 
> don't have to inspect the stack at all. For (2), all bets are off, so we have 
> to walk the entire stack. For (3), this patch switches the hard limit of 10 
> frames for the stack walk to instead bail out at the first frame outside of 
> the `java.base` module. In most cases this speeds up the stack walk as well, 
> if threads are running other code.
> 
> The test `TestSharedCloseJFR` is added for scenario (1), and the test 
> `TestSharedCloseJvmti` is added for scenario (2). Existing tests already 
> cover scenario (3).
> 
> Testing: tier 1-4

src/hotspot/share/prims/scopedMemoryAccess.cpp line 81:

> 79:     if (is_scoped) {
> 80:       assert(!would_have_bailed, "would have missed scoped method on 
> release build");
> 81:       func(stream);

Why do we remove the short-circuiting here? For example, if we have 
is_accessing_session set to true already, why can't we short circuit?

test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java line 30:

> 28:  * @requires vm.flavor != "zero"
> 29:  * @requires vm.debug
> 30:  * @requires vm.hasJFR

You can use & to require multiple conditions at once in one directive.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/27919#discussion_r2474193541
PR Review Comment: https://git.openjdk.org/jdk/pull/27919#discussion_r2474079765

Reply via email to