1. -- 
  2. with System; 
  3. with Ada.Text_IO; -- TEMP_ONLY 
  4.  
  5. package body Generic_Priority_Controller is 
  6.    use Ada; 
  7.  
  8.    Controller_Task_Priority : constant System.Priority := System.Default_Priority + 1; 
  9.    -- 
  10.    -- To be adapted - TEST_ONLY 
  11.  
  12.    --  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  13.  
  14.    task Controller is 
  15.       entry Start; 
  16.       entry Get (D : Data_Type'Class; With_P : Data_Priority_Type); 
  17.  
  18.       pragma Priority (Controller_Task_Priority); 
  19.    private 
  20.  
  21.       entry Request (Data_Priority_Type) (D : Data_Type'Class; With_P : Data_Priority_Type); 
  22.    end Controller; 
  23.  
  24.    --  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  25.  
  26.    task body Controller is 
  27.       Total : Integer := 0; 
  28.  
  29.    begin 
  30.       -- -- -- 
  31.  
  32.       accept Start; 
  33.  
  34.       Text_IO.Put_Line ("#> Controller starting ..."); 
  35.  
  36.       Outer : 
  37.       loop 
  38.  
  39.          if Total = 0 then 
  40.             -- 
  41.             --  Wait for a first request 
  42.  
  43.             select 
  44.  
  45.                accept Get (D : Data_Type'Class; With_P : Data_Priority_Type) do 
  46.                   Text_IO.Put_Line ("#> Receiving first " & Data_Priority_Type'Image (With_P)); 
  47.  
  48.                   Total := 1; 
  49.  
  50.                   requeue Request (With_P); 
  51.                end Get; 
  52.  
  53.             or 
  54.                terminate; 
  55.             end select; 
  56.  
  57.          end if; 
  58.  
  59.          -- -- -- 
  60.  
  61.          More_Entry_Calls : 
  62.          loop 
  63.  
  64.             select 
  65.  
  66.                accept Get (D : Data_Type'Class; With_P : Data_Priority_Type) do 
  67.                   Text_IO.Put_Line ("#> Receiving all " & Data_Priority_Type'Image (With_P)); 
  68.  
  69.                   Total := Total + 1; 
  70.  
  71.                   requeue Request (With_P); 
  72.                end Get; 
  73.  
  74.             else 
  75.                Text_IO.Put_Line ("#> Get queue in all is empty "); 
  76.  
  77.                exit More_Entry_Calls; 
  78.             end select; 
  79.  
  80.          end loop More_Entry_Calls; 
  81.  
  82.          --  Empty entry queue of Get 
  83.  
  84.          -- -- -- 
  85.  
  86.          Servicing_Requests : 
  87.          for P in Data_Priority_Type loop 
  88.  
  89.             Text_IO.Put_Line ("#> Servicing queue " & Data_Priority_Type'Image (P)); 
  90.  
  91.             select 
  92.                accept Request (P) (D : Data_Type'Class; With_P : Data_Priority_Type) do 
  93.                   Text_IO.Put_Line ("#> Servicing data " & Data_Priority_Type'Image (With_P)); 
  94.  
  95.                   Handler (D, P); 
  96.                end Request; 
  97.  
  98.                Total := Total - 1; 
  99.  
  100.                exit Servicing_Requests; 
  101.             -- 
  102.             --  exit Servicing_Requests when Total = 0; 
  103.             -- 
  104.             -- May be adapted 
  105.  
  106.             else 
  107.                null; 
  108.                Text_IO.Put_Line ("#> Request queue is empty " & Data_Priority_Type'Image (P)); 
  109.             end select; 
  110.  
  111.          end loop Servicing_Requests; 
  112.  
  113.          -- -- -- 
  114.  
  115.       end loop Outer; 
  116.  
  117.       -- -- -- 
  118.  
  119.    end Controller; 
  120.  
  121.    --  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  122.  
  123.    procedure Start is 
  124.    begin 
  125.       Controller.Start; 
  126.    end Start; 
  127.  
  128.    -- -- -- 
  129.  
  130.    procedure Get (D : Data_Type'Class; With_P : Data_Priority_Type) is 
  131.    begin 
  132.  
  133.       Controller.Get (D, With_P); 
  134.    end Get; 
  135.  
  136. end Generic_Priority_Controller;