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

D.14.1 Таймеры времени выполнения

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

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

Существует следующий определяемый языком библиотечный пакет:
with System;
package Ada.Execution_Time.Timers
with Nonblocking, Global => in out synchronized is
type Timer (T : not null access constant
Ada.Task_Identification.Task_Id) is
tagged limited private;
type Timer_Handler is
access protected procedure (TM : in out Timer)
with Nonblocking => False;
Min_Handler_Ceiling : constant System.Any_Priority :=
определяется реализацией;
procedure Set_Handler (TM : in out Timer;
In_Time : in Time_Span;
Handler : in Timer_Handler);
procedure Set_Handler (TM : in out Timer;
At_Time : in CPU_Time;
Handler : in Timer_Handler);
function Current_Handler (TM : Timer) return Timer_Handler;
procedure Cancel_Handler (TM : in out Timer;
Cancelled : out Boolean);
function Time_Remaining (TM : Timer) return Time_Span;
Timer_Resource_Error : exception;
private
... -- не определено языком
end Ada.Execution_Time.Timers;
Тип Timer представляет событие времени выполнения для одной задачи и способен обнаруживать переполнение времени выполнения. Дискриминанта доступа T идентифицирует соответствующую задачу. Тип Timer требует финализации (см. 7.6).
Объект типа Timer считается установленным, если он связан с ненулевым значением типа Timer_Handler, и очищенным в противном случае. Все объекты типа Timer изначально очищены.
Тип Timer_Handler идентифицирует защищенную процедуру, которая должна быть выполнена реализацией при истечении таймера. Такая защищенная процедура называется обработчиком.

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

При создании объекта Timer или при первом вызове процедуры Set_Handler с таймером в качестве параметра ресурсы, необходимые для работы таймера времени выполнения на основе связанных часов времени выполнения, выделены и инициализированы. Если эта операция превысит доступные ресурсы, возникает Timer_Resource_Error.
Процедуры Set_Handler связывают обработчик Handler с таймером TM: если Handler равен null, таймер очищается; в противном случае он устанавливается. Первая процедура Set_Handler загружает таймер TM с интервалом, заданным параметром Time_Span. В этом режиме таймер TM истекает, когда время выполнения задачи, идентифицированной TM.T.all, увеличивается на In_Time; если In_Time меньше или равно нулю, таймер истекает немедленно. Вторая процедура Set_Handler загружает таймер TM со значением, заданным At_Time. В этом режиме таймер TM истекает, когда время выполнения задачи, идентифицированной TM.T.all, достигает At_Time; если значение At_Time уже достигнуто при вызове Set_Handler, таймер истекает немедленно.
Вызов процедуры Set_Handler для таймера, который уже установлен, заменяет обработчик и (абсолютное или относительное) время выполнения; если Handler не равен null, таймер остается установленным.
Когда таймер истекает, связанный обработчик выполняется, передавая таймер в качестве параметра. Первым действием выполнения обработчика является очистка события.
Функция Current_Handler возвращает обработчик, связанный с таймером TM, если этот таймер установлен; в противном случае она возвращает null.
Процедура Cancel_Handler очищает таймер, если он установлен. Cancelled присваивается True, если таймер был установлен до его очистки; в противном случае ему присваивается False.
Функция Time_Remaining возвращает интервал времени выполнения, который остается до истечения таймера TM, если этот таймер установлен; в противном случае она возвращает Time_Span_Zero.
Константа Min_Handler_Ceiling — это минимальный приоритет потолка, необходимый для защищенного объекта с обработчиком, чтобы гарантировать отсутствие нарушения потолка при вызове этого обработчика.
В рамках финализации объекта типа Timer таймер очищается.
Для всех подпрограмм, определенных в этом пакете, Tasking_Error возникает, если задача, идентифицированная TM.T.all, завершена, а Program_Error возникает, если значение TM.T.all равно Task_Identification.Null_Task_Id.
Исключение, распространяемое из обработчика, вызванного в рамках истечения таймера, не имеет эффекта.

Ошибка выполнения

При вызове любой из подпрограмм, определенных в этом пакете, если задача, идентифицированная TM.T.all, больше не существует, выполнение программы является ошибочным.

Требования к реализации

Для заданного объекта Timer реализация должна выполнять объявленные в этом пакете операции атомарно по отношению к любым из этих операций над тем же объектом Timer. Замена обработчика путем вызова Set_Handler должна выполняться атомарно по отношению к выполнению обработчика.
При финализации объекта типа Timer системные ресурсы, используемые таймером, должны быть освобождены.

Разрешения реализации

Реализации могут ограничивать количество таймеров, которые могут быть определены для каждой задачи. Если этот предел превышен, возникает Timer_Resource_Error.
ПРИМЕЧАНИЕ Обработчик Timer_Handler может быть связан с несколькими объектами Timer.


Spec-Zone.ru

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