1. procedure Protected_Example is 
  2.  
  3.    type Priorities is (High, Low); 
  4.  
  5.    protected Queues is 
  6.       procedure Trigger (Priority : Priorities); 
  7.       entry     Queue   (Priorities); 
  8.    private 
  9.       Current_Priority : Priorities := Low; 
  10.       Open             : Boolean    := False; 
  11.    end Queues; 
  12.  
  13.    protected body Queues is 
  14.  
  15.       procedure Trigger (Priority : Priorities) is 
  16.  
  17.       begin 
  18.          Open := True; Current_Priority := Priority; 
  19.       end Trigger; 
  20.  
  21.       entry Queue (for Priority in Priorities) when Open and then Priority = Current_Priority is 
  22.  
  23.       begin 
  24.          Open := False; 
  25.       end Queue; 
  26.    end Queues; 
  27.  
  28.    task type Priority_Task (Priority : Priorities); 
  29.  
  30.    task body Priority_Task is 
  31.    begin 
  32.       Queues.Queue (Priority); 
  33.       if Priority = High then 
  34.          Queues.Trigger (High); 
  35.       end if; 
  36.    end Priority_Task; 
  37.  
  38.    T1         : Priority_Task (Low); 
  39.    T2, T3, T4 : Priority_Task (High); 
  40.  
  41. begin 
  42.    delay 1.0; -- seconds 
  43.    Queues.Trigger (High); 
  44.    delay 1.0; -- seconds 
  45.    Queues.Trigger (Low); 
  46. end Protected_Example;