summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src/BinaryMutex.cc
blob: 6426e5dfce6b57eb61cd944c4ebade343628273c (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
72
73
74
/* -------------------------------------------

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

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

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

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

		return No;
	}

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

		fLockingProcess = process;

		return Yes;
	}

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

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

		this->Lock(process);

		timer->Wait();

		return this->Lock(process);
	}

	/***********************************************************************************/
	/// @brief Wait for process **sec** until we check if it's free.
	/// @param sec seconds.
	/***********************************************************************************/
	BOOL BinaryMutex::WaitForProcess(const Int16& sec) noexcept
	{
		HardwareTimer hw_timer(rtl_seconds(sec));
		hw_timer.Wait();

		return !this->IsLocked();
	}
} // namespace Kernel