#include #include #include #include static DWORD WINAPI test_thread(LPVOID arg) { long timeout = rand(); timeout %= 1000; timeout += 100; Sleep(timeout); ExitThread(0); return 0; } static int start_threads(DWORD count, HANDLE *threads) { DWORD i; for (i=0; i (WAIT_OBJECT_0 + THREADS))) { printf("WaitForMultipleObjects INFINITE failed\n"); rc = 6; } if (WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE) != WAIT_OBJECT_0) { printf("WaitForMultipleObjects bWaitAll, INFINITE failed\n"); rc = 7; } if (close_threads(THREADS, threads)) return 8; if (rc) return rc; /* WaitOne, timeout */ if (start_threads(THREADS, threads)) return 9; if (WaitForMultipleObjects(THREADS, threads, FALSE, 50) != WAIT_TIMEOUT) { printf("WaitForMultipleObjects timeout 50 failed\n"); rc = 10; } if (WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE) != WAIT_OBJECT_0) { printf("WaitForMultipleObjects bWaitAll, INFINITE failed\n"); rc = 11; } if (close_threads(THREADS, threads)) return 12; if (rc) return 13; /* WaitOne, timeout, multiple joins */ if (start_threads(THREADS, threads)) return 14; for (i = 0; i < THREADS; i++) { if (WaitForMultipleObjects(THREADS, threads, FALSE, 0) != WAIT_TIMEOUT) { printf("WaitForMultipleObjects timeout 50 failed\n"); rc = 15; } } if (WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE) != WAIT_OBJECT_0) { printf("WaitForMultipleObjects bWaitAll, INFINITE failed\n"); rc = 16; } if (close_threads(THREADS, threads)) rc = 17; if (rc) return rc; /* Thread detach test */ if (start_threads(THREADS, threads)) return 18; if (close_threads(THREADS, threads)) return 19; return 0; }