Spec-Zone.ru › Ada 2012
Справочник Ada 2012

D.7 Ограничения для задач

В данном подпункте определены ограничения, которые могут быть использованы с пragma Restrictions (см. 13.12), чтобы облегчить создание высокоэффективных систем выполнения задач.

Статическая семантика

Ниже приведены определенные языком restriction_идентификаторы:
No_Task_Hierarchy

Ни одна задача не зависит от главного объекта, кроме главного объекта на уровне библиотеки.
No_Nested_Finalization

Объекты типа, которому необходима финализация (см. 7.6), объявляются только на уровне библиотеки. Если тип доступа не имеет доступности на уровне библиотеки, то нет аллокаторов типа, где тип, определяемый меткой_подтипа указания подтипа или квалифицированного_выражения нуждается в финализации.
No_Abort_Statements

Нет инструкций abort_statement, и нет использования имени имени, обозначающего Task_Identification.Abort_Task.
No_Terminate_Alternatives

Нет selective_accept с terminate_alternative.
No_Task_Allocators

Нет аллокаторов для типов задач или типов, содержащих подкомпоненты задач.
В случае инициализированного аллокатора типа доступа, назначенный тип которого является универсальным и ограниченным, выполняется проверка, что конкретный тип выделенного объекта не имеет подкомпонентов задач. Если проверка завершается неудачно, возникает ошибка Program_Error.
No_Implicit_Heap_Allocations

Нет операций, которые неявно требуют выделения памяти в куче от реализации. Операции, которые неявно требуют выделения памяти в куче, определяются реализацией.
No_Dynamic_Priorities

Нет семантических зависимостей от пакета Dynamic_Priorities, и нет вхождений атрибута Priority.
No_Dynamic_Attachment

Нет использования имени имени, обозначающего любую из операций, определенных в пакете Interrupts (Is_Reserved, Is_Attached, Current_Handler, Attach_Handler, Exchange_Handler, Detach_Handler и Reference).
No_Dynamic_CPU_Assignment

Ни одна задача не имеет аспект CPU, указанный как нестатическое выражение. Каждая задача (включая задачу окружения), у которой аспект CPU указан как Not_A_Specific_CPU, будет назначена конкретному процессору, определенному реализацией. То же самое относится к задаче окружения, когда аспект CPU не указан. Любая другая задача без аспекта CPU будет активироваться и выполняться на том же процессоре, что и активирующая ее задача.
No_Local_Protected_Objects

Защищенные объекты объявляются только на уровне библиотеки.
No_Local_Timing_Events

Timing_Events объявляются только на уровне библиотеки.
No_Protected_Type_Allocators

Нет аллокаторов для защищенных типов или типов, содержащих подкомпоненты защищенных типов.
В случае инициализированного аллокатора типа доступа, назначенный тип которого является универсальным и ограниченным, выполняется проверка, что конкретный тип выделенного объекта не имеет защищенных подкомпонентов. Если проверка завершается неудачно, возникает ошибка Program_Error.
No_Relative_Delay

Нет инструкций delay_relative_statement, и нет использования имени, обозначающего подпрограмму Timing_Events.Set_Handler, которая имеет параметр Time_Span.
No_Requeue_Statements

Нет инструкций requeue_statement.
No_Select_Statements

Нет инструкций select_statement.
No_Specific_Termination_Handlers

Нет использования имени, обозначающего подпрограммы Set_Specific_Handler и Specific_Handler в Task_Termination.
No_Tasks_Unassigned_To_CPU

Аспект CPU задан для задачи окружения. Никакой аспект CPU не задан статически равным Not_A_Specific_CPU. Если аспект CPU (динамически) задан значением Not_A_Specific_CPU, то возникает ошибка Program_Error. Если вызываются Set_CPU или Delay_Until_And_Set_CPU с параметром CPU, равным Not_A_Specific_CPU, то возникает ошибка Program_Error.
Simple_Barriers

Булево выражение в каждой барьерной точке входа либо является статическим выражением, либо именем, статически обозначающим компонент окружающего защищенного объекта.
Ниже приведены определенные языком restriction_parameter_идентификаторы:
Max_Select_Alternatives

Указывает максимальное количество альтернатив в selective_accept.
Max_Task_Entries

Указывает максимальное количество точек входа на задачу. Границы каждой группы входов заданного блока задач должны быть статическими или определяться дискриминантом подтипа, соответствующая граница которого является статической. Значение ноль указывает, что никакие встречи невозможны.
Max_Protected_Entries

Указывает максимальное количество точек входа на защищенный тип. Границы каждой группы входов защищенного блока должны быть статическими или определяться дискриминантом подтипа, соответствующая граница которого является статической.

Динамическая семантика

Следующий restriction_идентификатор определен языком:
No_Task_Termination

Все задачи являются бесконечными. Результат попытки завершения задачи определяется реализацией. Если установлен обработчик отката (см. C.7.3) для раздела, он должен быть вызван, когда первая задача попытается завершиться.
Следующие restriction_parameter_идентификаторы определены языком:
Max_Storage_At_Blocking

Указывает максимальную часть (в элементах памяти) размера Storage_Size задачи, которая может быть сохранена заблокированной задачей. Если реализация выбирает обнаружение нарушения этого ограничения, Storage_Error должно быть поднято; в противном случае поведение определяется реализацией.
Max_Asynchronous_Select_Nesting

Указывает максимальный динамический уровень вложенности asynchronous_selectов. Значение ноль предотвращает использование любых asynchronous_selectов, и, если программа содержит asynchronous_select, это является ошибкой. Если реализация выбирает обнаружение нарушения этого ограничения для значений, отличных от нуля, Storage_Error должно быть поднято; в противном случае поведение определяется реализацией.
Max_Tasks
Указывает максимальное количество созданий задач, которое может быть выполнено за время существования раздела, не считая создания задачи окружения. Значение ноль предотвращает создание любой задачи и, если программа содержит создание задачи, это является ошибкой. Если реализация выбирает обнаружение нарушения этого ограничения, Storage_Error должно быть поднято; в противном случае поведение определяется реализацией.
Max_Entry_Queue_Length

Max_Entry_Queue_Length определяет максимальное количество вызовов, которые находятся в очереди на вход. Нарушение этого ограничения приводит к возбуждению Program_Error в момент вызова или повторного помещения в очередь.
No_Standard_Allocators_After_Elaboration

Указывает, что аллокатор, использующий стандартный пул памяти (см. 13.11), не должен появляться внутри параметрической библиотечной подпрограммы, ни внутри handled_sequence_of_statements тела задачи. Для целей этой правила аллокатор типа, производного от формального типа доступа, не использует стандартный пул памяти.
При выполнении, Storage_Error поднимается, если аллокатор, использующий стандартный пул памяти, оценивается после завершения разработки элементов_библиотеки раздела.
Реализация определяется тем, приводит ли использование директивы Restrictions к уменьшению размера исполняемого файла, потребностей в памяти или времени выполнения. Если возможно, реализация должна предоставить количественные описания таких эффектов для каждой директивы.

Рекомендации для реализации

Когда это возможно, реализация должна использовать указанные ограничения для создания более эффективной реализации.
ПРИМЕЧАНИЯ
34 Вышеперечисленные Storage_Checks могут быть подавлены с помощью директивы Suppress.


Spec-Zone.ru

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