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 должен быть зарегистрирован предыдущим вызовом с типом regtypeCAF_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