#include "all-headers.h"

Semaphore::Semaphore (const uint32_t inInitialValue) :
mWaitingTaskList(), mValue (inInitialValue) {}

void Semaphore::sys_P (KERNEL_MODE) {
	if (mValue == 0) {
		kernel_blockRunningTaskInList(MODE_ mWaitingTaskList);
	}
	else {
		mValue --;
	}
}

void Semaphore::sys_V (IRQ_MODE) {
	TaskControlBlock * taskToRelease( mWaitingTaskList.removeFirstTask(MODE) );
	if (taskToRelease == nullptr) {
		mValue ++;
	}
	else {
		kernel_makeTaskReady(MODE_ taskToRelease);
	}
}