1. with Ada.Text_IO; use Ada.Text_IO; 
  2.  
  3. procedure Token_Ring is 
  4.  
  5.    Rounds : constant Positive := 10; 
  6.    type Ring_Range is mod 5; 
  7.  
  8.    task type Ring_Task  is 
  9.       entry Hand_over_Task_Id (Task_Id : Ring_Range); 
  10.       entry Token; 
  11.    end Ring_Task; 
  12.  
  13.    Ring : array (Ring_Range) of Ring_Task; 
  14.  
  15.    task body Ring_Task is 
  16.  
  17.       Activations : Natural := 0; 
  18.       Id, 
  19.       Next        : Ring_Range; 
  20.  
  21.    begin 
  22.       accept Hand_over_Task_Id (Task_Id : Ring_Range) do 
  23.          Id   := Task_Id; 
  24.          Next := Id + 1; 
  25.       end Hand_over_Task_Id; 
  26.  
  27.       while Activations < Rounds loop 
  28.          accept Token; 
  29.          Activations := Natural'Succ (Activations); 
  30.          Ring (Next).Token; 
  31.       end loop; 
  32.  
  33.       Put_Line ("Task" & Ring_Range'Image (Id) & " saw" & 
  34.                   Natural'Image (Activations) & " tokens"); 
  35.    end Ring_Task; 
  36.  
  37. begin 
  38.    for i in Ring'Range loop 
  39.       Ring (i).Hand_over_Task_Id (i); 
  40.    end loop; 
  41.  
  42.    Ring (Ring_Range'First).Token; 
  43. end Token_Ring;