From: quininer quininer@live.com
--- dlls/kernel32/tests/sync.c | 54 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+)
diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c index 56a9d6e4859..a486f4b7319 100644 --- a/dlls/kernel32/tests/sync.c +++ b/dlls/kernel32/tests/sync.c @@ -2841,6 +2841,59 @@ static void test_QueueUserAPC(void) ok(apc_count == 1, "APC count %u\n", apc_count); }
+typedef struct { + SYNCHRONIZATION_BARRIER barrier; + LONG flag; +} barrier_test_entry; + +static DWORD WINAPI barrier_worker(LPVOID b) { + barrier_test_entry *test = (barrier_test_entry*)b; + + Sleep(550); + InterlockedIncrement(&test->flag); + + EnterSynchronizationBarrier(&test->barrier, 0); + return 0; +} + +static void test_barrier(void) +{ + barrier_test_entry test; + DWORD dummy; + DWORD r; + DWORD start, dur; + + test.flag = 0; + r = InitializeSynchronizationBarrier(&test.barrier, 3, 0); + ok( r == TRUE, "init sync barrier failed\n"); + + start = GetTickCount(); + + CreateThread(NULL, 0, barrier_worker, &test, 0, &dummy); + CreateThread(NULL, 0, barrier_worker, &test, 0, &dummy); + + EnterSynchronizationBarrier(&test.barrier, 0); + + dur = GetTickCount() - start; + ok( dur >= 500, "barrier time too short: %ld\n", dur); + ok( test.flag == 2, "barrier flag check failed: %ld\n", test.flag ); + + /* reuse barrier object */ + start = GetTickCount(); + + CreateThread(NULL, 0, barrier_worker, &test, 0, &dummy); + CreateThread(NULL, 0, barrier_worker, &test, 0, &dummy); + + EnterSynchronizationBarrier(&test.barrier, 0); + + dur = GetTickCount() - start; + ok( dur >= 500, "barrier time too short: %ld\n", dur); + ok( test.flag == 4, "barrier flag check failed: %ld\n", test.flag ); + + r = DeleteSynchronizationBarrier(&test.barrier); + ok( r == TRUE, "delete sync barrier failed\n"); +} + START_TEST(sync) { char **argv; @@ -2912,4 +2965,5 @@ START_TEST(sync) test_alertable_wait(); test_apc_deadlock(); test_crit_section(); + test_barrier(); }