-
-
-
CENAPAD-MGCO
A seguir: TicketQueue Acima: Janaina Farnese Lacerda Anterior: Questão 1
#define LEFT 0
#define RIGHT 1
/* variaveis globais */
TicketQueue waiting;
key mutex;
bed b;
int nR = 0, nL = 0;
/* nR: numero de carros em cima da ponto indo para a direita */
/* nL: numero de carros em cima da ponto indo para a esquerda */
void car(int direction) {
/* processo associado ao carro */
switch(direction) {
case LEFT: {
requestLeft();
/* passando na ponte indo para a esquerda */
releaseLeft();
break;
}
case RIGHT: {
requestRight();
/* passando na ponte indo para a direita */
releaseRight();
break;
}
default: ERRO!;
}
}
void requestRight() {
lock(mutex);
int myTicket = waiting.getTicket();
while((nL > 0) || (!waiting.isTheBest(myTicket))) {
wait(b, mutex);
}
nR++;
waiting.ok(myTicket);
wakeup(b, mutex);
unlock(mutex);
}
void requestLeft() {
lock(mutex);
int myTicket = waiting.getTicket();
while((nR > 0) || (!waiting.isTheBest(myTicket))) {
wait(b, mutex);
}
nL++;
waiting.ok(myTicket);
wakeup(b, mutex);
unlock(mutex);
}
void releaseRight() {
lock(mutex);
nR--;
wakeup(b, mutex);
unlock(mutex);
}
void releaseLeft() {
lock(mutex);
nL--;
wakeup(b, mutex);
unlock(mutex);
}