procedure Protected_Example is
type Priority is (High, Low);
protected Trigger is
entry Trigger_High;
entry Trigger_Low;
entry Queue (P : in Priority);
private
Current_Priority : Priority := Low;
Trigger : Boolean := False;
end Trigger;
protected body Trigger is
entry Trigger_High when True is
begin
Current_Priority := High;
Trigger:=True;
end;
entry Trigger_Low when True is
begin
Current_Priority := Low;
Trigger:=True;
end;
entry Queue (P : in Priority) when Trigger is
begin
if P /= Current_Priority then
requeue Queue;
end if;
Trigger:=False;
end;
end Trigger;
task type Priority_Task(P: Priority);
task body Priority_Task is
begin
Trigger.Queue (P);
if P = High then
Trigger.Trigger_High;
end if;
end Priority_Task;
T1 : Priority_Task (Low);
T2, T3, T4 : Priority_Task (High);
begin
delay 1.0;
Trigger.Trigger_High;
delay 1.0;
Trigger.Trigger_Low;
end Protected_example;