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это размер массива или единица для скаляра.Когда используется
CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY, создаётся только маркер для компоненты с динамическим распределением или указателя. ПараметрSIZEтогда не используется. Напротив, при указанииCAF_REGTYPE_COARRAY_ALLOC_ALLOCATE_ONLY, token необходимо зарегистрировать в предыдущем вызове с типом regtypeCAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY, и либо память, указанная в data-ptr дескриптора DESC, регистрируется, либо память выделяется, когда data-ptrNULL. - Синтаксис:
-
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). Для типов блокировок и переменных критических участков начальное значение должно быть разблокированным (или соответственно не в критическом участке), например, ложным значением; для типов событий начальное состояние должно быть отсутствием события, например, нулевым.
Далее: _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-8.4.0/gfortran/_005fgfortran_005fcaf_005fregister.html