foil on monitor solution to Exercise 12-9 sleeping barber problem
barbershop: monitor
waiting : integer := 0; % customers waiting to be cut
customers : condition :=0; % for the barber to wait for a customer
barber : condition := 0; % for a customer to wait for the barber
procedure seek-customer( ) % called by the barber
begin if waiting=0 then WAIT (customers); % sleeps if there are none
waiting := waiting-1; % one less customer waiting
SIGNAL (barber); % frees a waiting customer
end seek-customer ;
procedure get-haircut( ) % called by a customer
begin if waiting < chairs % is there a free chair to sit and wait?
% if there are no free chairs just go away
then { waiting := waiting+1; % one more customer waiting
SIGNAL (customers) % in case the barber is asleep
WAIT (barber); % wait for your turn with the barber
}
end get-haircut;
end barbershop;