1. procedure Protected_Example is 
  2.  
  3.    type Priority is (High, Low); 
  4.  
  5.    protected Trigger is 
  6.       entry Trigger_High; 
  7.       entry Trigger_Low; 
  8.       entry Queue (P : in Priority); 
  9.    private 
  10.       Current_Priority : Priority := Low; 
  11.       Trigger : Boolean := False; 
  12.    end Trigger; 
  13.  
  14.    protected body Trigger is 
  15.  
  16.       entry Trigger_High when True is 
  17.  
  18.       begin 
  19.          Current_Priority := High; 
  20.          Trigger:=True; 
  21.       end; 
  22.  
  23.       entry Trigger_Low when True is 
  24.  
  25.       begin 
  26.          Current_Priority := Low; 
  27.          Trigger:=True; 
  28.       end; 
  29.  
  30.       entry Queue (P : in Priority) when Trigger is 
  31.  
  32.       begin 
  33.          if P /= Current_Priority then 
  34.             requeue Queue; 
  35.          end if; 
  36.          Trigger:=False; 
  37.       end; 
  38.    end Trigger; 
  39.  
  40.    task type Priority_Task(P: Priority); 
  41.  
  42.    task body Priority_Task is 
  43.    begin 
  44.       Trigger.Queue (P); 
  45.       if P = High then 
  46.          Trigger.Trigger_High; 
  47.       end if; 
  48.    end Priority_Task; 
  49.  
  50.    T1 : Priority_Task (Low); 
  51.    T2, T3, T4 : Priority_Task (High); 
  52.  
  53. begin 
  54.    delay 1.0; --seconds 
  55.    Trigger.Trigger_High; 
  56.    delay 1.0; --seconds 
  57.    Trigger.Trigger_Low; 
  58. end Protected_example;