Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- monitor Banios
- -- podria ser un array de records
- ocupado: array (1..5) of Boolean;
- nLimpiando: array (1..5) of Integer;
- esperando : array (1..5) of Integer;
- limpiadoresEsperando: array(1..5) of Integer;
- condEntrarUsuario : array(1..5) of condition;
- condEntrarLimpiador: array(1..5) of condition;
- procedure entrarUsuario(banio: out Integer)
- min_esperando : Integer := 3:
- begin
- banio := 0; -- 0 = none
- for i in (1..5) loop
- -- nota: no se puede chequar si hay limpiadores adentro
- if ocupado(i) = False then
- banio := i; -- uno libre, viajaaa
- break;
- else
- if esperando(i) < min_esperando then
- banio := i;
- min_esperando := esperando(i);
- end if;
- end if;
- end loop;
- if banio > 0 and then
- -- esperar por limpiadores o a que quede libre
- if ocupado(banio) = True or esperando(banio) > 0 or limpiadoresEsperando(banio) > 0 then
- -- se despierta cuando sale el ultimo limpiador
- -- o sale un usuario y no hay limpiadores esperando
- esperando(banio) := esperando(banio) + 1;
- condEntrarUsuario(banio).wait();
- end if;
- ocupado(banio) := True
- end if;
- end entrarUsuario;
- procedure saleUsuario(banio: in Integer)
- begin
- ocupado(banio) := False;
- -- limpiadores tiene prioridad
- if limpiadoresEsperando(banio) > 0 then
- condEntrarLimpiador(banio).signal();
- else
- condEntrarUsuario(banio).signal();
- end if;
- end saleUsuario;
- procedure entrarLimpiador(banio: out Integer)
- begin
- banio := 0;
- for i in (1..5) loop
- if limpiando(i) > 0 and limpiando(i) <= 2 then
- banio := i; -- hay gente limpiando y hay lugar, corto
- break;
- else if banio = 0 and
- limpiadoresEsperando(i) > 0 and
- limpiadoresEsperando(i) < 3 then
- banio := i; -- me guardo este para esperar
- else
- end if
- end loop;
- if banio = 0 then
- banio := que_banio();
- end if;
- if ocupado(banio) then -- limpiando > 0 => no ocupado
- limpiadoresEsperando(banio) := limpiadoresEsperando(banio) + 1;
- condEntrarLimpiador(banio).wait();
- limpiadoresEsperando(banio) = limpiadoresEsperando(banio) - 1;
- end if;
- limpiando(banio) := limpiando(banio) + 1;
- if limpiadoresEsperando(banio) > 0 then
- condEntrarLimpiador(banio).signal();
- end if;
- end entrarLimpiador;
- procedure salirLimpiador(banio: in Integer)
- begin
- limpiando(banio) := limpiando(banio) - 1;
- if limpiando(banio) = 0 then
- condEntrarUsuario(banio).signal();
- end if;
- end
- begin
- for i in (1..5) loop
- ocupado(i) := False;
- limpiando(i) := 0;
- esperando(i) := 0;
- limpiadoresEsperando(i) := 0;
- end loop;
- end Banios;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement