with System;
with Ada.Text_IO;
package body Generic_Priority_Controller is
use Ada;
Controller_Task_Priority : constant System.Priority := System.Default_Priority + 1;
task Controller is
entry Start;
entry Get (D : Data_Type'Class; With_P : Data_Priority_Type);
pragma Priority (Controller_Task_Priority);
private
entry Request (Data_Priority_Type) (D : Data_Type'Class; With_P : Data_Priority_Type);
end Controller;
task body Controller is
Total : Integer := 0;
begin
accept Start;
Text_IO.Put_Line ("#> Controller starting ...");
Outer :
loop
if Total = 0 then
select
accept Get (D : Data_Type'Class; With_P : Data_Priority_Type) do
Text_IO.Put_Line ("#> Receiving first " & Data_Priority_Type'Image (With_P));
Total := 1;
requeue Request (With_P);
end Get;
or
terminate;
end select;
end if;
More_Entry_Calls :
loop
select
accept Get (D : Data_Type'Class; With_P : Data_Priority_Type) do
Text_IO.Put_Line ("#> Receiving all " & Data_Priority_Type'Image (With_P));
Total := Total + 1;
requeue Request (With_P);
end Get;
else
Text_IO.Put_Line ("#> Get queue in all is empty ");
exit More_Entry_Calls;
end select;
end loop More_Entry_Calls;
Servicing_Requests :
for P in Data_Priority_Type loop
Text_IO.Put_Line ("#> Servicing queue " & Data_Priority_Type'Image (P));
select
accept Request (P) (D : Data_Type'Class; With_P : Data_Priority_Type) do
Text_IO.Put_Line ("#> Servicing data " & Data_Priority_Type'Image (With_P));
Handler (D, P);
end Request;
Total := Total - 1;
exit Servicing_Requests;
else
null;
Text_IO.Put_Line ("#> Request queue is empty " & Data_Priority_Type'Image (P));
end select;
end loop Servicing_Requests;
end loop Outer;
end Controller;
procedure Start is
begin
Controller.Start;
end Start;
procedure Get (D : Data_Type'Class; With_P : Data_Priority_Type) is
begin
Controller.Get (D, With_P);
end Get;
end Generic_Priority_Controller;