Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- personasEnLab: Mailbox; -- contador
- mayores65Esperando: Mailbox; -- contador
- menores65Esperando: Mailbox; -- contador
- entraMayor65: Mailbox; -- habilita entrada de mayor de 65
- entraMenor65: Mailbox; -- habilita entrada de menor de 65
- consultoriosLibres: Mailbox; -- contiene los consultorios libres
- pancienteEnConsultorio: Mailbox; -- despierta medico cuando entra paciente a consultorio
- busMedico: array (1..3) of Mailbox; -- comunicacion medico-paciente
- busConsultorio: array (1..2) of Mailbox; -- comunicacion dentro del consultorio
- procedure Main()
- begin
- send(personasEnLab, 0);
- for i in (1..2) loop
- send(consultoriosLibres, i);
- end loop;
- enviar(mayores65Esperando, 0);
- enviar(colaMenoresEsperando, 0);
- end Main;
- procedure Persona()
- edad : Integer;
- count, esperando : Integer;
- consultorio, idMedico: Integer;
- begin
- edad := obtener_edad();
- count := recibir(personasEnLab);
- if count >= 5 then
- enviar(personasEnLab, count);
- if edad >= 65 then
- esperando := recibir(mayores65Esperando);
- enviar(mayores65Esperando, esperando + 1);
- recibir(entraMayor65);
- else
- esperando := recibir(menores65Esperando);
- enviar(menores65Esperando, esperando + 1);
- recibir(entraMenor65);
- end if
- count := recibir(personasEnLab);
- end if;
- enviar(personasEnLab, count + 1);
- consultorio = recibir(consultoriosLibres);
- entrar_consultorio(consultorio)
- -- pido un medico
- enviar(pancienteEnConsultorio, consultorio);
- -- aca entra el medico (y toma la muestra ya que estamos)
- idMedico := recibir(busConsultorio(consultorio));
- -- al salir del consultorio hay que marcarlo como libre
- salir_consultorio(consultorio);
- enviar(consultoriosLibres, consultorio);
- -- espera a que medico termine analisis, y diga a que consultorio ir
- consultorio := recibir(busMedico);
- entrar_consultorio(consultorio);
- -- habilita al medico a entregar el informe
- enviar(busConsultorio(consultorio), NIL);
- -- ya notificado, se puede ir, aca podia usar busMedico y andaba igual
- recibir(busConsultorio(consultorio));
- salir_consultorio(consultorio)
- enviar(consultoriosLibres, consultorio);
- -- salida del lab
- count := recibir(personasEnLab);
- if count <= 5 then
- -- puede entrar alguien mas, mayores de 65 tienen prioridad
- esperando := recibir(mayores65Esperando);
- if esperando > 0 then
- enviar(entraMayor65, NIL);
- enviar(mayores65Esperando, esperando - 1);
- else
- enviar(mayores65Esperando, 0);
- esperando := recibir(menores65Esperando);
- if esperando > 0 then
- enviar(entraMenor65, NIL);
- enviar(menores65Esperando, esperando - 1);
- else
- enviar(menores65Esperando, 0);
- end if;
- end if;
- end if;
- enviar(personasEnLab, count - 1);
- end Persona;
- procedure Medico(id: Integer)
- m: muestra;
- r: boolean;
- begin
- loop
- consultorio = recibir(pancienteEnConsultorio);
- -- entrar_consultorio
- m := tomar_muestra();
- enviar(busConsultorio(consultorio), id); -- id del medico
- -- salir_consultorio
- r := analizar(); -- en el lab
- consultorio = recibir(consultoriosLibres);
- -- entrar_consultorio
- -- paciente espera por el resultado en la cola del medico
- enviar(busMedico(i), consultorio); -- notificar al paciente
- -- notar que podia usar busMedico, pero ya que estan los dos en el
- -- consultorio es mejor mantener la consistencia
- recibir(busConsultorio(consultorio)); -- esperar a que el paciente entre
- informar_resultado(r)
- enviar(busConsultorio(i), NIL); -- se pude ir
- -- salir_consultorio
- end loop;
- end Medico;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement