Spec-Zone.ru › GNU Fortran 13

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 это размер массива или 1 для скаляра.

Когда используется CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY, создаётся только маркер для компонента, который является выделенным или указателем. Параметр SIZE в этом случае не используется. Напротив, когда указан CAF_REGTYPE_COARRAY_ALLOC_ALLOCATE_ONLY, то маркер должен быть зарегистрирован предыдущим вызовом с 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, size_t 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, если его ранг не нулевой.

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

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

Spec-Zone.ru

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