libicsneo/include/icsneo/third-party/concurrentqueue/tests/relacy/relacy/test/event.hpp

119 lines
1.9 KiB
C++

#pragma once
#include "../relacy/relacy_std.hpp"
struct test_event_auto : rl::test_suite<test_event_auto, 2>
{
HANDLE ev;
VAR_T(int) data;
void before()
{
VAR(data) = 0;
ev = CreateEvent(0, 0, 0, 0);
}
void after()
{
CloseHandle(ev);
}
void thread(unsigned index)
{
if (0 == index)
{
VAR(data) = 1;
SetEvent(ev);
}
else
{
unsigned rv = WaitForSingleObject(ev, INFINITE);
assert(rv == WAIT_OBJECT_0);
assert(VAR(data) == 1);
rv = WaitForSingleObject(ev, 0);
assert(rv == WAIT_TIMEOUT);
}
}
};
struct test_event_atomic : rl::test_suite<test_event_atomic, 2>
{
HANDLE ev1;
HANDLE ev2;
void before()
{
ev1 = CreateEvent(0, 0, 0, 0);
ev2 = CreateEvent(0, 0, 0, 0);
}
void after()
{
CloseHandle(ev1);
CloseHandle(ev2);
}
void thread(unsigned index)
{
if (0 == index)
{
unsigned rv = WaitForSingleObject(ev1, INFINITE);
assert(rv == WAIT_OBJECT_0);
SetEvent(ev2);
rv = WaitForSingleObject(ev2, 0);
assert(rv == WAIT_TIMEOUT);
}
else
{
unsigned rv = SignalObjectAndWait(ev1, ev2, INFINITE, 0);
assert(rv == WAIT_OBJECT_0);
rv = WaitForSingleObject(ev2, 0);
assert(rv == WAIT_TIMEOUT);
}
}
};
struct test_event_manual : rl::test_suite<test_event_manual, 2>
{
HANDLE ev;
VAR_T(int) data;
void before()
{
VAR(data) = 0;
ev = CreateEvent(0, 1, 0, 0);
}
void after()
{
CloseHandle(ev);
}
void thread(unsigned index)
{
if (0 == index)
{
VAR(data) = 1;
SetEvent(ev);
}
else
{
unsigned rv = WaitForSingleObject(ev, INFINITE);
assert(rv == WAIT_OBJECT_0);
assert(VAR(data) == 1);
rv = WaitForSingleObject(ev, 0);
assert(rv == WAIT_OBJECT_0);
}
}
};