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 }