with Ada.Text_IO;
with Ada.Integer_Text_IO;
use Ada.Text_IO;
use Ada.Integer_Text_IO;
Procedure Cafeteria is
S: integer;
B: integer;
task type Estudiante;
type Est is access Estudiante;
task Agente_sillas is
entry sacar_silla;
entry dejar_silla;
end Agente_sillas;
task Agente_bandejas is
entry sacar_bandeja;
entry dejar_bandeja;
end Agente_bandejas;
task Cocinero is
entry servir;
end Cocinero;
task Cola_bandejas is
entry esperar;
end Cola_bandejas;
task Gen_Estudiantes;
task body Estudiante is
begin
if (S>0) then
Agente_sillas.sacar_silla;
--while (B<=0)loop
--Put("Esperando bandeja...");
--New_Line;
--end loop;
Agente_bandejas.sacar_bandeja;
Cocinero.servir;
Agente_bandejas.dejar_bandeja;
Agente_sillas.dejar_silla;
else
Put("Estudiante se fue por no encontrar silla");
New_Line;
end if;
end Estudiante;
task body Agente_sillas is
begin
loop
select
accept sacar_silla do
Put("Estudiante reservó silla");
New_Line;
S:=S-1;
end sacar_silla;
or
accept dejar_silla do
S:=S+1;
Put("Estudiante terminó de comer y se fue...");
Put("Nº sillas: ");
New_Line;
Put(S);
Put("Nº bandejas: ");
Put(B);
New_Line;
end dejar_silla;
end select;
end loop;
end Agente_sillas;
task body Agente_bandejas is
begin
loop
select
accept sacar_bandeja do
if (B>0)then
B:=B-1;
Put("Nº de bandejas: ");
Put(B);
New_Line;
delay(0.5);
else
Cola_bandejas.esperar;
end if;
end sacar_bandeja;
or
accept dejar_bandeja do
B:=B+1;
New_Line;
end dejar_bandeja;
end select;
end loop;
end Agente_bandejas;
task body Cocinero is
begin
loop
accept servir do
Put("Comida servida");
New_Line;
delay(0.5);
end servir;
end loop;
end Cocinero;
task body Cola_bandejas is
begin
loop
accept esperar do
delay(0.5);
Put("Estudiante se fue a la cola de bandejas");
New_Line;
while (B=0)loop
Put("Esperando bandeja...");
New_Line;
end loop;
B:=B-1;
end esperar;
end loop;
end Cola_bandejas;
task body Gen_Estudiantes is
T_Est: Est;
begin
loop
--Put("Llego un estudiante!");
--New_Line;
T_Est:= new Estudiante;
delay(0.1);
end loop;
end Gen_Estudiantes;
begin
S:=10;
B:=5;
end Cafeteria;