procedure Protected_Example is
type Priorities is (High, Low);
protected Queues is
procedure Trigger (Priority : Priorities);
entry Queue (Priorities);
private
Current_Priority : Priorities := Low;
Open : Boolean := False;
end Queues;
protected body Queues is
procedure Trigger (Priority : Priorities) is
begin
Open := True; Current_Priority := Priority;
end Trigger;
entry Queue (for Priority in Priorities) when Open and then Priority = Current_Priority is
begin
Open := False;
end Queue;
end Queues;
task type Priority_Task (Priority : Priorities);
task body Priority_Task is
begin
Queues.Queue (Priority);
if Priority = High then
Queues.Trigger (High);
end if;
end Priority_Task;
T1 : Priority_Task (Low);
T2, T3, T4 : Priority_Task (High);
begin
delay 1.0;
Queues.Trigger (High);
delay 1.0;
Queues.Trigger (Low);
end Protected_Example;