|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#include <stdlib.h>
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#include <winpr/crt.h>
|
|
Packit Service |
fa4841 |
#include <winpr/synch.h>
|
|
Packit Service |
fa4841 |
#include <winpr/thread.h>
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
static DWORD WINAPI test_thread(LPVOID arg)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
long timeout = rand();
|
|
Packit Service |
fa4841 |
timeout %= 1000;
|
|
Packit Service |
fa4841 |
timeout += 100;
|
|
Packit Service |
fa4841 |
Sleep(timeout);
|
|
Packit Service |
fa4841 |
ExitThread(0);
|
|
Packit Service |
fa4841 |
return 0;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static int start_threads(DWORD count, HANDLE *threads)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
DWORD i;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
for (i=0; i
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
threads[i] = CreateThread(NULL, 0, test_thread, NULL, 0, NULL);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!threads[i])
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
printf("CreateThread [%"PRIu32"] failure\n", i);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return 0;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
static int close_threads(DWORD count, HANDLE *threads)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
DWORD i;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
for (i=0; i
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (!CloseHandle(threads[i]))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
bb5c11 |
printf("CloseHandle [%"PRIu32"] failure\n", i);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return 0;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
int TestSynchMultipleThreads(int argc, char *argv[])
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
#define THREADS 24
|
|
Packit Service |
fa4841 |
DWORD rc = 0, ev, i;
|
|
Packit Service |
fa4841 |
HANDLE threads[THREADS];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* WaitForAll, timeout */
|
|
Packit Service |
fa4841 |
if (start_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
return 1;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (WaitForMultipleObjects(THREADS, threads, TRUE, 50) != WAIT_TIMEOUT)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("WaitForMultipleObjects bWaitAll, timeout 50 failed\n");
|
|
Packit Service |
fa4841 |
rc = 2;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE) != WAIT_OBJECT_0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("WaitForMultipleObjects bWaitAll, INFINITE failed\n");
|
|
Packit Service |
fa4841 |
rc = 3;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (close_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
return 4;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* WaitOne, infinite */
|
|
Packit Service |
fa4841 |
if (rc)
|
|
Packit Service |
fa4841 |
return rc;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (start_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
return 5;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
ev = WaitForMultipleObjects(THREADS, threads, FALSE, INFINITE);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
bb5c11 |
if ((ev < WAIT_OBJECT_0) || (ev > (WAIT_OBJECT_0 + THREADS)))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("WaitForMultipleObjects INFINITE failed\n");
|
|
Packit Service |
fa4841 |
rc = 6;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE) != WAIT_OBJECT_0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("WaitForMultipleObjects bWaitAll, INFINITE failed\n");
|
|
Packit Service |
fa4841 |
rc = 7;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (close_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
return 8;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (rc)
|
|
Packit Service |
fa4841 |
return rc;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* WaitOne, timeout */
|
|
Packit Service |
fa4841 |
if (start_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
return 9;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (WaitForMultipleObjects(THREADS, threads, FALSE, 50) != WAIT_TIMEOUT)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("WaitForMultipleObjects timeout 50 failed\n");
|
|
Packit Service |
fa4841 |
rc = 10;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE) != WAIT_OBJECT_0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("WaitForMultipleObjects bWaitAll, INFINITE failed\n");
|
|
Packit Service |
fa4841 |
rc = 11;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (close_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
return 12;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (rc)
|
|
Packit Service |
fa4841 |
return 13;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* WaitOne, timeout, multiple joins */
|
|
Packit Service |
fa4841 |
if (start_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
return 14;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (i = 0; i < THREADS; i++)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (WaitForMultipleObjects(THREADS, threads, FALSE, 0) != WAIT_TIMEOUT)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("WaitForMultipleObjects timeout 50 failed\n");
|
|
Packit Service |
fa4841 |
rc = 15;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE) != WAIT_OBJECT_0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("WaitForMultipleObjects bWaitAll, INFINITE failed\n");
|
|
Packit Service |
fa4841 |
rc = 16;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (close_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
rc = 17;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (rc)
|
|
Packit Service |
fa4841 |
return rc;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* Thread detach test */
|
|
Packit Service |
fa4841 |
if (start_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
return 18;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (close_threads(THREADS, threads))
|
|
Packit Service |
fa4841 |
return 19;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return 0;
|
|
Packit Service |
fa4841 |
}
|