with Ada.Text_Io; use Ada.Text_Io;
procedure Producer_Consumer is
protected Buffer is
entry Put(Item : in Integer);
entry Get(Item : out Integer);
private
Value : Integer;
Is_New : Boolean := False;
end Buffer;
protected body Buffer is
entry Put(Item : in Integer) when not Is_New is
begin
Value := Item;
Is_New := True;
end Put;
entry Get(Item : out Integer) when Is_New is
begin
Item := Value;
Is_New := False;
end Get;
end Buffer;
End_Of_Data : constant Integer := Integer'First;
task Producer;
task body Producer is
begin
for Num in 1..20 loop
Buffer.Put(Num);
end loop;
Buffer.Put(End_Of_Data);
end Producer;
task Consumer;
task body Consumer is
Next : Integer;
begin
loop
Buffer.Get(Next);
exit when Next = End_Of_Data;
Put_Line(Integer'Image(Next));
end loop;
end Consumer;
begin
null;
end Producer_Consumer;