
void requestPrinter(int fileSize) {
lock(mutex);
while (busy) { enterQueue(Q, fileSize, mutex); }
busy = true;
unlock(mutex);
}
void releasePrinter(void) {
lock(mutex);
busy = false;
select(Q, mutex);
unlock(mutex);
}
void enterQueue(queue Q; int priority; key mutex) {
int s = freeSlot(Q);
Q.slots[s].free = false;
Q.slots[s].priority = priority;
Q.n++;
sleep(Q.slots[s].b, mutex);
Q.slots[s].free = true;
}
void select(queue Q; key mutex) {
if(Q.n > 0) {
int s = bestSlot(Q);
wakeup(Q.slots[s].b, mutex);
Q.n-;
}
}