Ecere Software
/
sdk
/ blob
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
history
|
raw
|
HEAD
sdk: const correctness
[sdk]
/
ecere
/
src
/
sys
/
Condition.ec
1
#if defined(BUILDING_ECERE_COM)
2
import "Semaphore"
3
#else
4
import "ecere"
5
#endif
6
7
public class Condition : struct
8
{
9
const char * name;
10
Mutex lock { };
11
int waiting;
12
int signals;
13
Semaphore waitSem { };
14
Semaphore waitDone { };
15
16
public:
17
property const char * name
18
{
19
set { name = value; }
20
get { return name; }
21
}
22
23
void Signal()
24
{
25
lock.Wait();
26
if (waiting > signals)
27
{
28
signals++;
29
waitSem.Release();
30
lock.Release();
31
waitDone.Wait();
32
}
33
else
34
lock.Release();
35
}
36
37
void Wait(Mutex mutex)
38
{
39
lock.Wait();
40
waiting++;
41
lock.Release();
42
43
mutex.Release();
44
45
waitSem.Wait();
46
47
lock.Wait();
48
if(signals > 0)
49
{
50
waitDone.Release();
51
signals--;
52
}
53
waiting--;
54
lock.Release();
55
56
mutex.Wait();
57
}
58
}