Spec-Zone.ru › GNU Fortran 7

8.2.8 _gfortran_caf_register — Регистрация комассивов

Описание:

Регистрирует память для комассива и создаёт маркер для идентификации комассива. Подпрограмма вызывается как для комассивов с атрибутом SAVE, так и при использовании явного оператора ALLOCATE. Если произошла ошибка, и STAT является NULL указателем, функция прерывается с выводом сообщения об ошибке и запуском завершения с ошибкой. Если ошибки не произошло, и STAT присутствует, он устанавливается в ноль. В противном случае ему присваивается положительное значение, а если не NULL, ERRMSG устанавливается в строку, описывающую ошибку. Подпрограмма регистрирует память, предоставленную в DATA-компоненте описателя массива DESC, если эта компонента не NULL, иначе она выделяет достаточную память и предоставляет указатель на неё в DATA-компоненте DESC. Описатель массива имеет ранг ноль, когда регистрируется скалярный объект, и описатель массива может быть недействительным после вызова _gfortran_caf_register. При выделении массива описатель сохраняется.

Для CAF_REGTYPE_COARRAY_STATIC и CAF_REGTYPE_COARRAY_ALLOC, переданный размер — это запрашиваемый размер в байтах. Для CAF_REGTYPE_LOCK_STATIC, CAF_REGTYPE_LOCK_ALLOC и CAF_REGTYPE_CRITICAL это размер массива или 1 для скаляра.

Если используется CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY, создаётся только маркер для компоненты с выделенной памятью или указателем. Параметр SIZE в этом случае не используется. Напротив, при указании CAF_REGTYPE_COARRAY_ALLOC_ALLOCATE_ONLY, маркер token должен быть зарегистрирован предыдущим вызовом с типом regtype CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY, и либо память, указанная в data-ptr описателя desc, регистрируется, либо выделяется, если data-ptr равен NULL.

Синтаксис:

void caf_register (size_t size, caf_register_t type, caf_token_t *token, gfc_descriptor_t *desc, int *stat, char *errmsg, int errmsg_len)

Аргументы:
size Для обычных комассивов — размер комассива в байтах, который нужно выделить; для типов блокировок и событий — число элементов.
type один из типов caf_register_t.
token intent(out) Непрозрачный указатель, идентифицирующий комассив.
desc intent(inout) (Псевдо)описатель массива.
stat intent(out) Для комассивов с выделенной памятью, хранит STAT=; может быть NULL
errmsg intent(out) При возникновении ошибки, устанавливается в сообщение об ошибке; может быть NULL
errmsg_len размер буфера errmsg.
ПРИМЕЧАНИЯ

Невыделяемые комассивы должны регистрироваться перед использованием на удалённых образах. Для гарантии этого они должны быть зарегистрированы до начала основной программы. Это можно добиться, создав конструкторские функции. Именно это делает GCC, чтобы память для невыделяемых комассивов также выделялась, а не использовалась статическая память. Маркер позволяет идентифицировать комассив; для процессора маркер — это неперекрывающийся указатель. Библиотека может, например, хранить базовый адрес комассива в марке, некоторый идентификатор или более сложную структуру. Библиотека также может хранить описатель массива DESC, когда его ранг не равен нулю.

Для типов блокировок значение используется только для проверки статуса выделения. Обратите внимание, что для критических участков блокировка требуется только на одном изображении; в операторе блокировки процессор всегда должен передавать индекс изображения один для переменных блокировки критических участков (CAF_REGTYPE_CRITICAL). Для типов блокировок и переменных критических участков начальное значение должно быть разблокировано (или, соответственно, не в критическом участке), например, значение ложь; для типов событий начальное состояние должно быть без события, например, ноль.

Далее: _gfortran_caf_deregister, Предыдущее: _gfortran_caf_stopped_images, Вверх: Документация по ABI функций [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gfortran/_005fgfortran_005fcaf_005fregister.html

Spec-Zone.ru

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