about summary refs log tree commit diff stats
path: root/lib/Caelum/Player.rakumod
Commit message (Expand)AuthorAgeFilesLines
* Initial implementationAndinus2021-04-271-0/+8
href='/ahoang/Nim/blame/lib/genode_cpp/syslocks.h?h=devel&id=3cb645ab500487b62d82c9d02c0e7f21b2cf1413'>blame)
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
75
76
77
78
/*
 *
 *           Nim's Runtime Library
 *       (c) Copyright 2017 Emery Hemingway
 *
 *   See the file "copying.txt", included in this
 *   distribution, for details about the copyright.
 *
 */

#ifndef _GENODE_CPP__SYSLOCKS_H_
#define _GENODE_CPP__SYSLOCKS_H_

/* Genode includes */
#include <base/semaphore.h>
#include <base/lock.h>

namespace Nim {
	struct SysLock;
	struct SysCond;
}

struct Nim::SysLock
{
	Genode::Lock _lock_a, _lock_b;
	bool         _locked;

	void acquireSys()
	{
		_lock_a.lock();
		_locked = true;
		_lock_a.unlock();
		_lock_b.lock();
	}

	bool tryAcquireSys()
	{
		if (_locked)
			return false;

		_lock_a.lock();
		if (_locked) {
			_lock_a.unlock();
			return false;
		} else {
			_locked = true;
			_lock_b.lock();
			_lock_a.unlock();
			return true;
		}
	}

	void releaseSys()
	{
		_locked = false;
		_lock_a.unlock();
		_lock_b.unlock();
	}
};

struct Nim::SysCond
{
	Genode::Semaphore _semaphore;

	void waitSysCond(SysLock &syslock)
	{
		syslock.releaseSys();
		_semaphore.down();
		syslock.acquireSys();
	}

	void signalSysCond()
	{
		_semaphore.up();
	}
};

#endif