Руководство по Ada 2012
H.6 Директива Partition_Elaboration_Policy
Этот подраздел определяет директиву pragma для управления политикой проработки.
Синтаксис
Форма директивы pragma Partition_Elaboration_Policy следующая:
pragma Partition_Elaboration_Policy (policy_идентификатор);
policy_идентификатор должен быть либо Sequential, либо Concurrent, либо определённым реализацией идентификатором.
Правила после компиляции
Директива pragma Partition_Elaboration_Policy является конфигурационной директивой. Она определяет политику проработки для раздела. Для раздела может быть указана не более одной политики проработки.
Если для раздела указана политика Sequential, то для раздела также должна быть указана директива Restrictions (No_Task_Hierarchy).
Динамическая семантика
Несмотря на то, что этот международный стандарт говорит об обратном, эта директива pragma позволяет изменить правила проработки раздела, касающиеся активации задач и подключения прерываний. Если policy_идентификатор равен Concurrent, или если для раздела не определена директива Partition_Elaboration_Policy, то применяются правила, определённые в другом месте этого стандарта.
Если политика проработки раздела — Sequential, то активация задач и подключение обработчиков прерываний выполняются в следующей последовательности шагов:
- Активация всех задач уровня библиотеки и подключение обработчиков прерываний откладываются до обработки всех единиц библиотеки.
- Обработчики прерываний подключаются задачей среды.
- Задача среды приостанавливается, пока активируются задачи уровня библиотеки.
- Задача среды выполняет главную подпрограмму (если таковая имеется) параллельно с этими выполняющимися задачами.
Если несколько отложенных подключений обработчиков динамических прерываний для одного прерывания, то обработчик, который подключается, определяется последним вызовом Attach_Handler или Exchange_Handler.
Если какая-либо отложенная активация задачи завершается ошибкой, то в начале последовательности операторов тела задачи среды, до вызова главной подпрограммы, возбуждается Tasking_Error.
Рекомендации для реализации
Если политика проработки раздела — Sequential и задача среды блокируется навсегда во время проработки, то раздел находится в тупике, и рекомендуется немедленно завершить раздел.
Разрешения для реализации
Если политика проработки раздела — Sequential и активация какой-либо задачи завершается ошибкой, реализация может немедленно завершить активный раздел, чтобы устранить опасность продолжения выполнения с подмножеством активных задач.
ПРИМЕЧАНИЯ
12 Если какая-либо отложенная активация задачи завершается с ошибкой, задача среды не может обработать исключение Tasking_Error и завершается немедленно. В отличие от этого, если политика проработки раздела — Concurrent, то это исключение может быть обработано внутри единицы библиотеки.