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