aboutsummaryrefslogtreecommitdiff
path: root/src/Platform/Win32/Condition.c
blob: d4f9d99d2924999b94bf92a7b65786661920a90a (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
#include "Thread.h"


BH_Condition *BH_ConditionNew(void)
{
    BH_Condition *condition;

    /* Allocate space for mutex and initialize it */
    condition = malloc(sizeof(BH_Condition));
    if (condition)
    {
        InitializeConditionVariable(&condition->handle);
    }

    return condition;
}


void BH_ConditionFree(BH_Condition *condition)
{
    BH_UNUSED(condition);
}


int BH_ConditionWait(BH_Condition *condition,
                     BH_Mutex *mutex)
{
    return BH_ConditionWaitFor(condition, mutex, INFINITE);
}


int BH_ConditionWaitFor(BH_Condition *condition,
                        BH_Mutex *mutex,
                        uint32_t timeout)
{
    switch (SleepConditionVariableCS(&condition->handle, &mutex->handle, timeout))
    {
        case 0: return BH_ERROR;
        case ERROR_TIMEOUT: return BH_TIMEOUT;
        default: return BH_OK;
    }
}


int BH_ConditionSignal(BH_Condition *condition)
{
    WakeConditionVariable(&condition->handle);
    return BH_OK;
}


int BH_ConditionBroadcast(BH_Condition *condition)
{
    WakeAllConditionVariable(&condition->handle);
    return BH_OK;
}