1. -- 
  2. -- Uwe R. Zimmer, Australia, 2013 
  3. -- 
  4.  
  5. with Ada.Text_IO;         use Ada.Text_IO; 
  6. with Queue_Pack_Abstract; 
  7. with Queue_Pack_Concrete; 
  8.  
  9. procedure Queue_Test_Dispatching is 
  10.  
  11.    package Queue_Pack_Abstract_Character is 
  12.      new Queue_Pack_Abstract (Character); 
  13.    use Queue_Pack_Abstract_Character; 
  14.  
  15.    type Queue_Size is mod 3; 
  16.  
  17.    package Queue_Pack_Character is 
  18.      new Queue_Pack_Concrete (Queue_Pack_Abstract_Character, Queue_Size); 
  19.    use Queue_Pack_Character; 
  20.  
  21.    type Queue_Class is access all Queue_Interface'class; 
  22.  
  23.    task Queue_Holder; -- could be on an individual partition / separate computer 
  24.  
  25.    task Queue_User is -- could be on an individual partition / separate computer 
  26.       entry Send_Queue (Remote_Queue : Queue_Class); 
  27.    end Queue_User; 
  28.  
  29.    task body Queue_Holder is 
  30.  
  31.       Local_Queue : constant Queue_Class := new Protected_Queue; 
  32.       Item        : Character; 
  33.  
  34.    begin 
  35.       Queue_User.Send_Queue (Local_Queue); 
  36.       Local_Queue.all.Dequeue (Item); 
  37.       Put_Line ("Local dequeue (Holder): " & Character'Image (Item)); 
  38.    end Queue_Holder; 
  39.  
  40.    task body Queue_User is 
  41.  
  42.       Local_Queue : constant Queue_Class := new Protected_Queue; 
  43.       Item        : Character; 
  44.  
  45.    begin 
  46.       accept Send_Queue (Remote_Queue : Queue_Class) do 
  47.          Remote_Queue.all.Enqueue ('r'); -- potentially a remote procedure call! 
  48.          Local_Queue.all.Enqueue  ('l'); 
  49.       end Send_Queue; 
  50.       Local_Queue.all.Dequeue (Item); 
  51.       Put_Line ("Local dequeue (User)  : " & Character'Image (Item)); 
  52.    end Queue_User; 
  53.  
  54. begin 
  55.    null; 
  56. end Queue_Test_Dispatching;