RFR: 8347408: Create an internal method handle adapter for system calls with errno
ExE Boss
duke at openjdk.org
Fri Jan 10 09:34:57 UTC 2025
On Tue, 26 Nov 2024 15:04:51 GMT, Per Minborg <pminborg at openjdk.org> wrote:
> Going forward, 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 to add a _JDK internal_ method handle adapter that can be used to handle system calls with `errno`, `GetLastError`, and `WSAGetLastError`.
>
> It currently relies on a thread-local cache of MemorySegments to allide allocations. If, in the future, a more efficient thread-associated allocation scheme becomes available, we could easily migrate to that one.
>
> Tested and passed tiers 1-3.
Since the `returnFilter(…)` methods are only ever invoked reflectively by method handle combinators, they can use `throws Throwable`, which avoids possible double‑wrapping of `Error`s (`StackOverflowError` or `OutOfMemoryError`) and `RuntimeException`s:
src/java.base/share/classes/jdk/internal/foreign/CaptureStateUtil.java line 171:
> 169: throw new InternalError(t);
> 170: }
> 171: }
Suggestion:
private static int returnFilter(MethodHandle errorHandle, int result) throws Throwable {
if (result >= 0) {
return result;
}
return -(int) errorHandle.invoke();
}
src/java.base/share/classes/jdk/internal/foreign/CaptureStateUtil.java line 183:
> 181: throw new InternalError(t);
> 182: }
> 183: }
Suggestion:
private static long returnFilter(MethodHandle errorHandle, long result) throws Throwable {
if (result >= 0) {
return result;
}
return -(int) errorHandle.invoke();
}
src/java.base/share/classes/jdk/internal/foreign/ErrnoUtil.java line 122:
> 120: }
> 121:
> 122: // Used reflectively via RETURN_FILTER_MH
Suggestion:
// Used reflectively via INT_RETURN_FILTER_MH
src/java.base/share/classes/jdk/internal/foreign/ErrnoUtil.java line 127:
> 125: }
> 126:
> 127: // Used reflectively via RETURN_FILTER_MH
Suggestion:
// Used reflectively via LONG_RETURN_FILTER_MH
src/java.base/share/classes/jdk/internal/foreign/ResultErrno.java line 30:
> 28: *
> 29: * @param result the result returned from the native call
> 30: * @param errno the errno (if result <= 0) or 0
Suggestion:
* @param errno the errno (if result < 0) or 0
-------------
PR Review: https://git.openjdk.org/jdk/pull/22391#pullrequestreview-2465893687
PR Review Comment: https://git.openjdk.org/jdk/pull/22391#discussion_r1861206877
PR Review Comment: https://git.openjdk.org/jdk/pull/22391#discussion_r1861207179
PR Review Comment: https://git.openjdk.org/jdk/pull/22391#discussion_r1860280069
PR Review Comment: https://git.openjdk.org/jdk/pull/22391#discussion_r1860280510
PR Review Comment: https://git.openjdk.org/jdk/pull/22391#discussion_r1859646876
More information about the core-libs-dev
mailing list