with Ada.Text_IO; use Ada.Text_IO;
with Ada.Calendar; use Ada.Calendar;
procedure Synchronize is
Start_Up_Time : constant Time := Clock;
No_Of_Tasks : constant Positive := 2;
subtype Task_Range is Positive range 1 .. No_Of_Tasks;
procedure Put_Line_w_Time (S : String) is
begin
Put_Line ("At" & Duration'Image (Clock - Start_Up_Time) & " s : " & S);
end Put_Line_w_Time;
procedure Put_Line_w_Time_n_Task_Id (Id : Task_Range; S : String) is
begin
Put_Line_w_Time ("Task" & Task_Range'Image (Id) & " " & S);
end Put_Line_w_Time_n_Task_Id;
task type Pinger is
entry Hand_over_Id (Given_Id : Task_Range);
entry Last_Sync;
end Pinger;
task body Pinger is
Id : Task_Range;
begin
Put_Line_w_Time ("Task ? is waiting for a ""Hand_over_Id"" rendezvous");
accept Hand_over_Id (Given_Id : Task_Range) do
Id := Given_Id;
Put_Line_w_Time_n_Task_Id (Id, "in a ""Hand_over_Id"" rendezvous");
end Hand_over_Id;
Put_Line_w_Time_n_Task_Id (Id, "after a ""Hand_over_Id"" rendezvous");
for i in 1 .. 4 loop
Put_Line_w_Time ("Task" & Positive'Image (Id) & " active.");
delay Duration (Id);
end loop;
Put_Line_w_Time_n_Task_Id (Id, "waiting for a ""Last_Sync"" rendezvous");
accept Last_Sync do
Put_Line_w_Time_n_Task_Id (Id, "in a ""Last_Sync"" rendezvous");
end Last_Sync;
Put_Line_w_Time_n_Task_Id (Id, "after a ""Last_Sync"" rendezvous");
end Pinger;
Tasks : array (Task_Range) of Pinger;
begin
for i in Tasks'Range loop
Put_Line_w_Time_n_Task_Id (i, "is called at ""Hand_over_Id""");
Tasks (i).Hand_over_Id (i);
Put_Line_w_Time_n_Task_Id (i, "released main task from ""Hand_over_Id""");
end loop;
for i in reverse Tasks'Range loop
Put_Line_w_Time_n_Task_Id (i, "is called at ""Last_Sync""");
Tasks (i).Last_Sync;
Put_Line_w_Time_n_Task_Id (i, "released main task from ""Last_Sync""");
end loop;
end Synchronize;