23 lines
416 B
C++
23 lines
416 B
C++
#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++;
|
|
}
|
|
}
|