Spec-Zone.ru › OpenJDK 27

Интерфейс 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 или прочитаны обычными средствами.

Состояние выполнения инициализируется из сегмента native-памяти, предоставленного пользователем дескриптору метода downcall, или сохраняется в этот сегмент. Для этой цели дескриптор метода downcall, связанный с данным параметром, будет иметь дополнительный параметр MemorySegment, непосредственно следующий за целевым адресом, а также необязательные параметры SegmentAllocator. Этот параметр, сегмент состояния захвата, представляет сегмент native-памяти, из которого инициализируется состояние захвата и в который оно сохраняется.

Размер и выравнивание сегмента состояния захвата должны быть совместимы с компоновкой, возвращаемой методом captureStateLayout(). Эта компоновка представляет собой компоновку структуры с именованным полем для каждого захватываемого значения.

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

В следующем примере показано использование этого параметра линкера:

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);
    errnoHandle.set(capturedState, 0L, 0); // set errno to 0
    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 предоставляется через временный native-адрес, действительный на протяжении вызова функции. Поэтому этот механизм рекомендуется использовать только в тех случаях, когда функции требуется кратковременный доступ к памяти кучи Java, а копирование соответствующих данных в сегмент памяти вне кучи слишком сильно сказалось бы на производительности.

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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, 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.

Spec-Zone.ru

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