summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/src/Semaphore.cc
blob: def49b51386839f80f0b84cd81267419db63e1e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* -------------------------------------------

	Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.

------------------------------------------- */

#include <KernelKit/UserProcessScheduler.h>
#include <KernelKit/Semaphore.h>

namespace Kernel
{
	/***********************************************************************************/
	/// @brief Unlocks the semaphore.
	/***********************************************************************************/
	Bool Semaphore::Unlock() noexcept
	{
		if (fLockingProcess)
		{
			fLockingProcess		   = UserProcess();
			fLockingProcess.Status = ProcessStatusKind::kFrozen;
			return Yes;
		}

		return No;
	}

	/***********************************************************************************/
	/// @brief Locks process in the semaphore.
	/***********************************************************************************/
	Bool Semaphore::Lock(UserProcess& process)
	{
		if (!process || fLockingProcess)
			return No;

		fLockingProcess = process;

		return Yes;
	}

	/***********************************************************************************/
	/// @brief Checks if process is locked.
	/***********************************************************************************/
	Bool Semaphore::IsLocked() const
	{
		return fLockingProcess.Status == ProcessStatusKind::kRunning;
	}

	/***********************************************************************************/
	/// @brief Try lock or wait.
	/***********************************************************************************/
	Bool Semaphore::LockOrWait(UserProcess& process, TimerInterface* timer)
	{
		if (timer == nullptr)
			return No;

		this->Lock(process);

		timer->Wait();

		return this->Lock(process);
	}

	/***********************************************************************************/
	/// @brief Wait for process to be free.
	/***********************************************************************************/
	Void Semaphore::WaitForProcess() noexcept
	{
		while (fLockingProcess)
			;
	}
} // namespace Kernel