File : atomic_action.adb
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Real_Time; use Ada.Real_Time;
with Atomic_Action_Types; use Atomic_Action_Types;
with Generic_Atomic_Action;
package body Atomic_Action is
No_Of_Tasks : constant Positive := 3;
subtype Tasks_Index is Positive range 1..No_Of_Tasks;
------------------------
-- Actions Parts
------------------------
procedure Action_Task_1 is
begin
Put_Line ("First_Action_Part: begin");
-- raise Constraint_error;
delay (1.0);
-- raise Constraint_error;
Put_Line ("First_Action_Part: end");
end Action_Task_1;
procedure Action_Task_2 is
begin
Put_Line ("Second_Action_Part: begin");
-- raise Constraint_error;
delay 2.0;
-- raise Constraint_error;
Put_Line ("Second_Action_Part: end");
end Action_Task_2;
procedure Action_Task_3 is
begin
Put_Line ("Third_Action_Part: begin");
-- raise Constraint_error;
delay 3.0;
-- raise Constraint_error;
Put_Line ("Third_Action_Part: end");
end Action_Task_3;
------------------------
-- Cleanup Parts
------------------------
procedure Cleanup_Task_1 is
begin
Put_Line ("First_One_Cleanup");
end Cleanup_Task_1;
procedure Cleanup_Task_2 is
begin
Put_Line ("Second_One_Cleanup");
end Cleanup_Task_2;
procedure Cleanup_Task_3 is
begin
Put_Line ("Third_One_Cleanup");
end Cleanup_Task_3;
------------------------
-- Set up configuration
------------------------
Actions : Action_Parts (Tasks_Index) :=
(1 => (Action => Action_Task_1'Access,
Cleanup => Cleanup_Task_1'Access,
Scope => (Start_Delay_Min => Milliseconds (33),
Start_Delay_Max => Milliseconds (133),
Max_Elapse => Milliseconds (2000),
Deadline => Time_Last)
),
2 => (Action => Action_Task_2'Access,
Cleanup => Cleanup_Task_2'Access,
Scope => (Start_Delay_Min => Milliseconds (22),
Start_Delay_Max => Milliseconds (122),
Max_Elapse => Milliseconds (3000),
Deadline => Time_Last)
),
3 => (Action => Action_Task_3'Access,
Cleanup => Cleanup_Task_3'Access,
Scope => (Start_Delay_Min => Milliseconds (11),
Start_Delay_Max => Milliseconds (111),
Max_Elapse => Milliseconds (4000),
Deadline => Time_Last)
));
package Atomic_Action is new Generic_Atomic_Action (Actions);
use Atomic_Action;
-------------------------------
-- Perform the atomic action
-------------------------------
procedure Perform is
begin
Atomic_Action.Perform;
exception
when Failure_State =>
Put_Line ("Failure in Atomic_Action");
raise Atomic_Action_Failure;
when Time_Out_State =>
Put_Line ("Time_Out in Atomic_Action");
raise Atomic_Action_Time_Out;
when Late_Activation_State =>
Put_Line ("Late_Activation in Atomic_Action");
raise Atomic_Action_Late_Activation;
end Perform;
end Atomic_Action;