Hola, tengo el siguiente codigo del task Baño y me genera una duda porque la letra pide que el reponedor y el de limpieza puedan existir dentro de cada cada baño. Para respetar la prioridad utilizo el llegoMantenimiento´Count > 0 (porque lo ejecutan ambos)
El caso que me genera duda es cuando tengo personas utilizando el baño y se ejecuta llegoMantenimiento pero cantPersonas no es 0, tengo entendido que el select evalua todas las guardas y descarta las falsas, por ende solo serian verdaderas:
*cantPersonasManteniendo >0
*cantPersonas > 0
Que pasa con Reponedor y Limpiador si la primer guarda es falsa? se bloquea en algun accept de las guardas verdaderas?
otra pregunta si este codigo esta mal? como seria la solución correcta? no me doy cuenta como bloquear a los de mantenimiento hasta que no existan personas en el baño (cantPersonas == 0).
task type Baño is
entry entrar
entry salir
entry llegoMantenimiento
entry salirMantenimiento
task body Baño is
Integer cantPersonas
Integer nroBaño
Integer cantPersonasDesdeUltimaLimpieza
Integer cantPersonasManteniendo
begin
cantPersonasDesdeUltimaLimpieza = 0
cantPersonas = 0
cantPersonasManteniendo = 0
accept numero(in : Integer nro)
nroBaño = nro
loop
select
when llegoMantenimiento´count > 0 and cantPersonas == 0 and cantPersonasManteniendo < 2
accept llegoMantenimiento(in : Boolean tipo)
cantPersonasManteniendo ++
if tipo
limpiar(cantPersonasDesdeUltimaLimpieza)
cantPersonasDesdeUltimaLimpieza = 0
else
reponer()
or
when cantPersonasManteniendo > 0
accept salirMantenimiento
cantPersonasManteniendo --
or
when llegoMantenimiento´count == 0 and cantPersonas < 4
and cantPersonasManteniendo == 0
accept entrar
cantPersonas ++
cantPersonasDesdeUltimaLimpieza ++
or
when cantPersonas > 0
accept salir
cantPersonas --
endloop
end