7.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— это размер массива или единица для скаляра.Когда используется
CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY, тогда создаётся только маркер для компонент с динамическим выделением или указателями. ПараметрSIZEтогда не используется. Напротив, при указанииCAF_REGTYPE_COARRAY_ALLOC_ALLOCATE_ONLY, маркер должен быть зарегистрирован предыдущим вызовом с типом регистр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, size_t errmsg_len) - Аргументы:
-
size Для обычных комассивов — размер комассива, подлежащего выделению, в байтах; для типов блокировок и типов событий — число элементов. type один из типов caf_register_t. token intent(out) Непрозрачный указатель, идентифицирующий комассив. desc intent(inout) (Псевдо)описатель массива. stat intent(out) Для комассивов с динамическим выделением, сохраняет значение STAT =; может быть NULLerrmsg intent(out) В случае ошибки устанавливается сообщение об ошибке; может быть NULLerrmsg_len размер буфера errmsg. - ПРИМЕЧАНИЯ
-
Нединамически выделяемые комассивы должны быть зарегистрированы до использования удалёнными изображениями. Для гарантии этого, они должны быть зарегистрированы до начала основной программы. Этого можно достичь, создав конструкторские функции. Именно это делает GCC, таким образом, что и для нединамически выделяемых комассивов память выделяется и не используется статическая память. Маркер позволяет идентифицировать комассив; для процессора маркер — это указатель без алиасов. Библиотека может, например, хранить базовый адрес комассива в маркере, некоторый дескриптор или более сложную структуру. Библиотека также может хранить описатель массива DESC, если его ранг не равен нулю.
Для типов блокировок значение должно использоваться только для проверки состояния выделения. Обратите внимание, что для критических блоков блокировка требуется только на одном изображении; в операторе блокировки процессор всегда должен передавать индекс изображения равный единице для переменных блокировки критического блока (
CAF_REGTYPE_CRITICAL). Для типов блокировок и переменных критических блоков начальное значение должно быть разблокировано (соответственно, не в критической секции), например, значение false; для типов событий начальное состояние должно быть без события, например, ноль.
Далее: _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-12.1.0/gfortran/_005fgfortran_005fcaf_005fregister.html