RFR: 8347408: Create an internal method handle adapter for system calls with errno [v6]
Per Minborg
pminborg at openjdk.org
Tue Apr 29 12:33:34 UTC 2025
> As we advance, converting older JDK code to use the relatively new FFM API requires system calls that can provide `errno` and the likes to explicitly allocate a `MemorySegment` to capture potential error states. This can lead to negative performance implications if not designed carefully and also introduces unnecessary code complexity.
>
> Hence, this PR proposes adding a JDK internal method handle adapter that can be used to handle system calls with `errno`, `GetLastError`, and `WSAGetLastError`.
>
> It relies on an efficient carrier-thread-local cache of memory regions to allide allocations.
>
>
> Here are some benchmarks that ran on a platform thread and virtual threads respectively (M1 Mac):
>
>
> Benchmark Mode Cnt Score Error Units
> CaptureStateUtilBench.OfVirtual.adaptedSysCallFail avgt 30 24.330 ? 0.820 ns/op
> CaptureStateUtilBench.OfVirtual.adaptedSysCallSuccess avgt 30 8.257 ? 0.117 ns/op
> CaptureStateUtilBench.OfVirtual.explicitAllocationFail avgt 30 41.415 ? 1.013 ns/op
> CaptureStateUtilBench.OfVirtual.explicitAllocationSuccess avgt 30 21.720 ? 0.463 ns/op
> CaptureStateUtilBench.OfVirtual.tlAllocationFail avgt 30 23.636 ? 0.182 ns/op
> CaptureStateUtilBench.OfVirtual.tlAllocationSuccess avgt 30 8.234 ? 0.156 ns/op
> CaptureStateUtilBench.adaptedSysCallFail avgt 30 23.918 ? 0.487 ns/op
> CaptureStateUtilBench.adaptedSysCallSuccess avgt 30 4.946 ? 0.089 ns/op
> CaptureStateUtilBench.explicitAllocationFail avgt 30 42.280 ? 1.128 ns/op
> CaptureStateUtilBench.explicitAllocationSuccess avgt 30 21.809 ? 0.413 ns/op
> CaptureStateUtilBench.tlAllocationFail avgt 30 24.422 ? 0.673 ns/op
> CaptureStateUtilBench.tlAllocationSuccess avgt 30 5.182 ? 0.152 ns/op
>
>
> Adapted system call:
>
> return (int) ADAPTED_HANDLE.invoke(0, 0); // Uses a MH-internal pool
> ```
> Explicit allocation:
>
> try (var arena = Arena.ofConfined()) {
> return (int) HANDLE.invoke(arena.allocate(4), 0, 0);
> }
> ```
> Thread Local allocation:
>
> try (var arena = POOLS.take()) {
> return (int) HANDLE.invoke(arena.allocate(4), 0, 0); // Uses a manually specified pool
> }
> ```
> The adapted system call exhibits a ~4x performance improvement over the existing "explicit allocation" scheme for the happy path on platform threads. ...
Per Minborg has updated the pull request incrementally with one additional commit since the last revision:
Add hashCode/equals to record to improve startup time
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/23765/files
- new: https://git.openjdk.org/jdk/pull/23765/files/c0e46d30..174da716
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=23765&range=05
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=23765&range=04-05
Stats: 12 lines in 1 file changed: 12 ins; 0 del; 0 mod
Patch: https://git.openjdk.org/jdk/pull/23765.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/23765/head:pull/23765
PR: https://git.openjdk.org/jdk/pull/23765
More information about the core-libs-dev
mailing list