Blame winpr/libwinpr/synch/test/TestSynchMultipleThreads.c

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
}