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, создаётся только маркер для компонент allocatable или pointer. Параметр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, size_t errmsg_len) - Аргументы:
-
size Для обычных комассивов — размер комассива в байтах; для типов блокировок и событий — число элементов. type Один из типов caf_register_t. token intent(out) Непрозрачный указатель, идентифицирующий комассив. desc intent(inout) (Псевдо)дескриптор массива. stat intent(out) Для allocatable комассивов хранит 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-9.3.0/gfortran/_005fgfortran_005fcaf_005fregister.html