Интерфейс Linker.Option
- Охватывающий интерфейс:
Linker
public static sealed interface Linker.Option
- Начиная с версии:
- 22
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static Linker.Option |
captureCallState |
Возвращает параметр компоновщика, используемый для сохранения частей состояния выполнения сразу после вызова внешней функции, связанной с дескриптором метода downcall, до того, как это состояние может быть перезаписано средой выполнения Java или прочитано обычными средствами. |
static StructLayout |
captureStateLayout() |
Возвращает структуру компоновки, представляющую компоновку сегмента состояния вызова, передаваемого дескриптору downcall, связанному с captureCallState(String...). |
static Linker.Option |
critical |
Возвращает параметр компоновщика, используемый для пометки внешней функции как критической. |
static Linker.Option |
firstVariadicArg |
Возвращает параметр компоновщика, задающий индекс начала аргументов переменной длины, передаваемых функции, описанной дескриптором функции, связанным с запросом на компоновку downcall. |
Подробное описание методов
firstVariadicArg
static Linker.Option firstVariadicArg(int index)
Значение index должно соответствовать 0 <= index <= N, где N — количество компоновок аргументов дескриптора функции, используемого вместе с этим параметром компоновщика. Если index равно:
-
0, все аргументы, передаваемые функции, передаются как аргументы переменной длины -
N, ни один из аргументов, передаваемых функции, не передается как аргумент переменной длины -
m, где0 < m < N, аргументыm..N-1передаются как аргументы переменной длины
- Примечание по реализации:
- Значение индекса проверяется при создании запроса на компоновку, когда становится доступен дескриптор функции, относительно которого проверяется индекс.
- Параметры:
-
index— индекс первой компоновки аргумента переменной длины в дескрипторе функции, связанном с запросом на компоновку downcall - Возвращает:
- параметр компоновщика, задающий индекс начала аргументов переменной длины, передаваемых функции, описанной дескриптором функции, связанным с запросом на компоновку downcall
captureCallState
static Linker.Option captureCallState(String... capturedState)
Состояние выполнения захватывается дескриптором метода downcall при вызове путем записи в нативный сегмент, предоставленный пользователем дескриптору метода downcall. Для этого дескриптор метода downcall, связанный с данным параметром, будет иметь дополнительный параметр типа MemorySegment, непосредственно следующий за целевым адресом и необязательными параметрами типа SegmentAllocator. Этот параметр, сегмент состояния вызова, представляет собой нативный сегмент, в который записывается захваченное состояние.
Размер и выравнивание сегмента состояния вызова должны быть совместимы с компоновкой, возвращаемой методом captureStateLayout(). Эта компоновка представляет собой компоновку структуры с именованным полем для каждого захваченного значения.
Захваченное состояние можно получить из сегмента состояния вызова, создав дескрипторы переменных на основе компоновки состояния вызова.
В следующем примере показано использование этого параметра компоновщика:
MemorySegment targetAddress = ...
Linker.Option ccs = Linker.Option.captureCallState("errno");
MethodHandle handle = Linker.nativeLinker().downcallHandle(targetAddress, FunctionDescriptor.ofVoid(), ccs);
StructLayout capturedStateLayout = Linker.Option.captureStateLayout();
VarHandle errnoHandle = capturedStateLayout.varHandle(PathElement.groupElement("errno"));
try (Arena arena = Arena.ofConfined()) {
MemorySegment capturedState = arena.allocate(capturedStateLayout);
handle.invoke(capturedState);
int errno = (int) errnoHandle.get(capturedState, 0L);
// use errno
}
- Параметры:
-
capturedState— имена значений, которые нужно сохранить - Возвращает:
- параметр компоновщика, используемый для сохранения частей состояния выполнения сразу после вызова внешней функции, связанной с дескриптором метода downcall, до того, как это состояние может быть перезаписано средой выполнения Java или прочитано обычными средствами
- Вызывает:
-
IllegalArgumentException— если хотя бы одно из предоставленных именcapturedStateне поддерживается на текущей платформе - См. также:
captureStateLayout
static StructLayout captureStateLayout()
captureCallState(String...). Компоновка состояния вызова зависит от платформы, но гарантированно является компоновкой структуры, содержащей только компоновки значений и, возможно, компоновки заполнения. Например, в Windows возвращаемая компоновка может содержать три компоновки значений с именами:
- GetLastError
- WSAGetLastError
- errno
Клиенты могут получить имена поддерживаемых компоновок захватываемых значений следующим образом:
List<String> capturedNames = Linker.Option.captureStateLayout().memberLayouts().stream()
.map(MemoryLayout::name)
.flatMap(Optional::stream)
.toList();
- Возвращает:
- структуру компоновки, представляющую компоновку сегмента состояния вызова, передаваемого дескриптору downcall, связанному с
captureCallState(String...) - См. также:
critical
static Linker.Option critical(boolean allowHeapAccess)
Критическая функция — это функция, время выполнения которой во всех случаях крайне мало (сопоставимо с вызовом пустой функции) и которая не выполняет обратный вызов Java (например, используя заглушку upcall).
Использование этого параметра компоновщика служит подсказкой, которую некоторые реализации могут применять для выполнения оптимизаций, допустимых только для критических функций.
Использование этого параметра компоновщика при компоновке некритических функций, вероятно, приведет к нежелательным последствиям, таким как снижение производительности или сбои JVM.
Критические функции могут при необходимости получать доступ к куче Java. Это позволяет клиентам передавать сегменты памяти в куче в качестве адресов, хотя обычно допустимы только сегменты памяти вне кучи. Область памяти в куче Java доступна через временный нативный адрес, действительный в течение вызова функции. Поэтому этот механизм рекомендуется использовать только в тех случаях, когда функции требуется кратковременный доступ к памяти кучи Java, а копирование необходимых данных в сегмент памяти вне кучи было бы неприемлемым с точки зрения производительности.
- Параметры:
-
allowHeapAccess— должен ли связанный метод разрешать доступ к куче Java. - Возвращает:
- параметр компоновщика, используемый для пометки внешней функции как критической
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/foreign/Linker.Option.html