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