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