Spec-Zone.ru › OpenJDK 25

Интерфейс Linker.Option

Охватывающий интерфейс:
Linker
public static sealed interface Linker.Option
Параметр компоновщика используется для передачи дополнительных параметров запросу на компоновку.
Начиная с версии:
22

Краткое описание методов

Модификатор и тип Метод Описание
static Linker.Option captureCallState(String... capturedState)
Возвращает параметр компоновщика, используемый для сохранения частей состояния выполнения сразу после вызова внешней функции, связанной с дескриптором метода downcall, до того, как это состояние может быть перезаписано средой выполнения Java или прочитано обычными средствами.
static StructLayout captureStateLayout()
Возвращает структуру компоновки, представляющую компоновку сегмента состояния вызова, передаваемого дескриптору downcall, связанному с captureCallState(String...).
static Linker.Option critical(boolean allowHeapAccess)
Возвращает параметр компоновщика, используемый для пометки внешней функции как критической.
static Linker.Option firstVariadicArg(int index)
Возвращает параметр компоновщика, задающий индекс начала аргументов переменной длины, передаваемых функции, описанной дескриптором функции, связанным с запросом на компоновку downcall.

Подробное описание методов

firstVariadicArg

static Linker.Option firstVariadicArg(int index)
Возвращает параметр компоновщика, задающий индекс начала аргументов переменной длины, передаваемых функции, описанной дескриптором функции, связанным с запросом на компоновку downcall.

Значение 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, до того, как это состояние может быть перезаписано средой выполнения Java или прочитано обычными средствами.

Состояние выполнения захватывается дескриптором метода 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()

captureStateLayout

static StructLayout captureStateLayout()
Возвращает структуру компоновки, представляющую компоновку сегмента состояния вызова, передаваемого дескриптору downcall, связанному с captureCallState(String...).

Компоновка состояния вызова зависит от платформы, но гарантированно является компоновкой структуры, содержащей только компоновки значений и, возможно, компоновки заполнения. Например, в Windows возвращаемая компоновка может содержать три компоновки значений с именами:

  • GetLastError
  • WSAGetLastError
  • errno

Клиенты могут получить имена поддерживаемых компоновок захватываемых значений следующим образом:

   List<String> capturedNames = Linker.Option.captureStateLayout().memberLayouts().stream()
       .map(MemoryLayout::name)
       .flatMap(Optional::stream)
       .toList();
Возвращает:
структуру компоновки, представляющую компоновку сегмента состояния вызова, передаваемого дескриптору downcall, связанному с captureCallState(String...)
См. также:
  • captureCallState(String...)

critical

static Linker.Option critical(boolean allowHeapAccess)
Возвращает параметр компоновщика, используемый для пометки внешней функции как критической.

Критическая функция — это функция, время выполнения которой во всех случаях крайне мало (сопоставимо с вызовом пустой функции) и которая не выполняет обратный вызов Java (например, используя заглушку upcall).

Использование этого параметра компоновщика служит подсказкой, которую некоторые реализации могут применять для выполнения оптимизаций, допустимых только для критических функций.

Использование этого параметра компоновщика при компоновке некритических функций, вероятно, приведет к нежелательным последствиям, таким как снижение производительности или сбои JVM.

Критические функции могут при необходимости получать доступ к куче Java. Это позволяет клиентам передавать сегменты памяти в куче в качестве адресов, хотя обычно допустимы только сегменты памяти вне кучи. Область памяти в куче Java доступна через временный нативный адрес, действительный в течение вызова функции. Поэтому этот механизм рекомендуется использовать только в тех случаях, когда функции требуется кратковременный доступ к памяти кучи Java, а копирование необходимых данных в сегмент памяти вне кучи было бы неприемлемым с точки зрения производительности.

Параметры:
allowHeapAccess — должен ли связанный метод разрешать доступ к куче Java.
Возвращает:
параметр компоновщика, используемый для пометки внешней функции как критической

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API