Handout
This commit is contained in:
22
kernel/sync/semaphore.cc
Normal file
22
kernel/sync/semaphore.cc
Normal file
@@ -0,0 +1,22 @@
|
||||
#include "./semaphore.h"
|
||||
|
||||
#include "../interrupt/guard.h"
|
||||
#include "../thread/thread.h"
|
||||
|
||||
void Semaphore::p(Vault &vault) {
|
||||
if (counter == 0) {
|
||||
waiting.enqueue(*vault.scheduler.active());
|
||||
vault.scheduler.resume(false);
|
||||
} else {
|
||||
counter--;
|
||||
}
|
||||
}
|
||||
|
||||
void Semaphore::v(Vault &vault) {
|
||||
Thread *customer = waiting.dequeue();
|
||||
if (customer != nullptr) {
|
||||
vault.scheduler.ready(customer);
|
||||
} else {
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user