Sleeping Barber

Program SleepingBarber;
Const NCHAIRS = 3;
Var waitingClientes : integer;
Clientes, Barbers, Mutex : Semáforo;

Procedure Barber;
BEGIN
    Repeat
        Down(Clientes); /* Espera chegada de algum Cliente */
        Down
(Mutex); /* Região Crítica para atualizar waitingClientes */
         waitingClientes := waitingClientes - 1;
        Up
(Barbers); /* Acorda Barbeiro Dorminhoco */
        Up
(Mutex);
        CortarCabelo; /* Corta cabelo de cliente *
   
Until false;
END;

Procedure Clientes;
    BEGIN
        Down
(Mutex); /* Região Crítica para atualizar waitingClientes */
        if waitingClientes < NCHAIRS then
        BEGIN
            waitingClientes := waitingClientes + 1;
            Up(Clientes); /* Avisa chegada de um novo cliente */
            Up
(Mutex);
            Down(Barbers); /* Vai dormir se não existem Barbeiros livres */
            EsperaCorteCabelo; /* Fica na fila para cortar cabelo */
       
END
        else
            Up(Mutex);
     END;

    BEGIN
        Barbers.valor := 0; Clientes.valor := 0;
        Mutex.valor := 1;
        waitingClientes := 0;
        PARBEGIN
          Clientes;   Clientes; 
          Clientes;   Clientes; 
          Clientes;   Clientes;  Clientes;
          Barber;
        PAREND;    
    END.