PROGRAM ED2009_3 ------------------------- CAJA ------------------------- TASK TYPE Caja IS ENTRY IngresarMama(); ENTRY IngresarComun(); ENTRY Entregar(vProducto: IN PRODUCTO); END; TASK BODY Caja IS VAR producto: PRODUCTO; BEGIN LOOP SELECT ACCEPT IngresarMama(); OR WHEN IngresarMama' COUNT == 0 DO ACCEPT IngresarComun(); END; DO ACCEPT Entregar(vProducto: IN PRODUCTO) DO producto := vProducto; END; WHILE producto <> FIN; END; END; ------------------------- CLIENTE ------------------------- TASK TYPE Cliente IS END; TASK BODY Cliente IS VAR iCaja: INTEGER; producto: PRODUCTO; BEGIN iCaja := elegirCaja(); IF soyFuturaMama() THEN cajas[iCaja].IngresarMama(); ELSE cajas[iCaja].IngresarComun(); END; DO producto := sacarProductoDeCarro(); IF producto <> FIN AND vencido(producto) THEN Supervisor.IngresarQueja(iCaja); Supervisor.Intercambiar[iCaja](producto); END; cajas[iCaja].Entregar(producto); WHILE producto <> FIN; END; ------------------------- SUPERVISOR ------------------------- TASK Supervisor IS ENTRY IngresarQueja(vICaja: IN INTEGER); ENTRY ARRAY [1..10] OF Intercambiar(vProducto: IN OUT PRODUCTO); -- ¿Está bien definirlo así? END; TASK BODY Supervisor IS VAR iCaja: INTEGER; cantQuejas: INTEGER; BEGIN FOR i := 1 TO 10 DO quejas[i] := 0; END; cantQuejas := 0; LOOP SELECT WHEN cantQuejas < 3 DO ACCEPT IngresarQueja(vICaja: IN INTEGER) DO iCaja := vICaja; END; cantQuejas := cantQuejas + 1; registrarQueja(iCaja); OR IF cantQuejas < 3 THEN -- ¿Está bien esta solución? DELAY(5*60*100); -- ¿No era en ms? END; WHILE cantQuejas <> 0 DO iCaja := prioridad(); ACCEPT Intercambiar[iCaja](vProducto: IN OUT PRODUCTO) DO vProducto := resolverQueja(vProducto); END; cantQuejas := cantQuejas - 1; END; END; END; END; ------------------------- PROGRAMA PRINCIPAL ------------------------- VAR cajas: ARRAY [1..10] OF Caja; clientes: ARRAY [1..n] OF Cliente; BEGIN END.