Advertisement
ichramm

propuestaSolucionC1-Parcial.adb

Jun 7th, 2020
4,468
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 3.20 KB | None | 0 0
  1.  
  2. monitor Banios
  3.  
  4.     -- podria ser un array de records
  5.     ocupado: array (1..5) of Boolean;
  6.     nLimpiando: array (1..5) of Integer;
  7.     esperando : array (1..5) of Integer;
  8.     limpiadoresEsperando: array(1..5) of Integer;
  9.  
  10.     condEntrarUsuario : array(1..5) of condition;
  11.     condEntrarLimpiador: array(1..5) of condition;
  12.  
  13.     procedure entrarUsuario(banio: out Integer)
  14.         min_esperando : Integer := 3:
  15.     begin
  16.         banio := 0; -- 0 = none
  17.         for i in (1..5) loop
  18.             -- nota: no se puede chequar si hay limpiadores adentro
  19.             if ocupado(i) = False then
  20.                 banio := i; -- uno libre, viajaaa
  21.                 break;
  22.             else
  23.                 if esperando(i) < min_esperando then
  24.                     banio := i;
  25.                     min_esperando := esperando(i);
  26.                 end if;
  27.             end if;
  28.         end loop;
  29.  
  30.         if banio > 0 and then
  31.             -- esperar por limpiadores o a que quede libre
  32.             if ocupado(banio) = True or esperando(banio) > 0 or limpiadoresEsperando(banio) > 0 then
  33.                 -- se despierta cuando sale el ultimo limpiador
  34.                 -- o sale un usuario y no hay limpiadores esperando
  35.                 esperando(banio) := esperando(banio) + 1;
  36.                 condEntrarUsuario(banio).wait();
  37.             end if;
  38.             ocupado(banio) := True
  39.         end if;
  40.     end entrarUsuario;
  41.  
  42.     procedure saleUsuario(banio: in Integer)
  43.     begin
  44.         ocupado(banio) := False;
  45.         -- limpiadores tiene prioridad
  46.         if limpiadoresEsperando(banio) > 0 then
  47.             condEntrarLimpiador(banio).signal();
  48.         else
  49.             condEntrarUsuario(banio).signal();
  50.         end if;
  51.     end saleUsuario;
  52.  
  53.     procedure entrarLimpiador(banio: out Integer)
  54.     begin
  55.         banio := 0;
  56.         for i in (1..5) loop
  57.             if limpiando(i) > 0 and limpiando(i) <= 2 then
  58.                 banio := i; -- hay gente limpiando y hay lugar, corto
  59.                 break;
  60.             else if banio = 0 and
  61.                     limpiadoresEsperando(i) > 0 and
  62.                     limpiadoresEsperando(i) < 3 then
  63.                 banio := i; -- me guardo este para esperar
  64.             else
  65.             end if
  66.         end loop;
  67.  
  68.         if banio = 0 then
  69.             banio := que_banio();
  70.         end if;
  71.  
  72.         if ocupado(banio) then -- limpiando > 0 => no ocupado
  73.             limpiadoresEsperando(banio) := limpiadoresEsperando(banio) + 1;
  74.             condEntrarLimpiador(banio).wait();
  75.             limpiadoresEsperando(banio) = limpiadoresEsperando(banio) - 1;
  76.         end if;
  77.  
  78.         limpiando(banio) := limpiando(banio) + 1;
  79.  
  80.         if limpiadoresEsperando(banio) > 0 then
  81.             condEntrarLimpiador(banio).signal();
  82.         end if;
  83.     end entrarLimpiador;
  84.  
  85.     procedure salirLimpiador(banio: in Integer)
  86.     begin
  87.         limpiando(banio) := limpiando(banio) - 1;
  88.         if limpiando(banio) = 0 then
  89.             condEntrarUsuario(banio).signal();
  90.         end if;
  91.     end
  92.  
  93. begin
  94.     for i in (1..5) loop
  95.         ocupado(i) := False;
  96.         limpiando(i) := 0;
  97.         esperando(i) := 0;
  98.         limpiadoresEsperando(i) := 0;
  99.     end loop;
  100. end Banios;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement