
class FairRW {
TicketQueue waiting;
int ticket = 0, nw = 0, nr = 0;
key mutex;
void requestRead() {
lock(mutex);
while((nw > 0)
(!waiting.iAmTheBest(myTicket))) {
waiting.enter(myTicket, mutex);
}
nr++;
waiting.ok(myTicket);
unlock(mutex);
}
void requestWrite() {
lock(mutex);
while((nw + nr > 0)
(!waiting.iAmTheBest(myTicket))) {
waiting.enter(myTicket, mutex);
}
nw++;
waiting.ok(myTicket);
unlock(mutex);
}