Producer and Consumer – Ada Rendezvous

 

procedure prod_cons_ada;

   task buffer is

       entry append(x: in integer);

       entry remove(y: out integer);

   end buffer;

   task producer;

   task consumer;

 

task body buffer is

   count : integer := 0 in : integer := 0; out : integer := 0;

   buff: array(0..n-1) of integer;

   begin

       loop

          select

              when count < n =>

                 accept append(x : in integer) do

                     buff(in) := x;

                 end insert;

              in := (in – 1) mod n; count := count + 1;

          or

              when count > 0 =>

                 accept remove(y : out integer) do

                     y := buff(out);

                 end remove;

              out := (out + 1) mod n; count := count – 1;

       end select;

   end loop;

end buffer;

 

task body producer is                                    task body consumer is

   item : integer;                                                item : integer;

   begin                                                             begin

       loop                                                               loop

          generate item;                                                 buffer.remove(item);

          buffer.append(item);                                        use item;

       end loop;                                                       end loop;

   end producer;                                                 end consumer;

 

begin -- main procedure executable code

   null;

end prod_cons_ada