Improved runtime of unit tests
This commit is contained in:
parent
2a91afb0cf
commit
c5fded2d83
@ -133,7 +133,7 @@ static BOOL run_encode_decode(UINT16 bpp, BITMAP_INTERLEAVED_CONTEXT* encoder,
|
|||||||
PROFILER_CREATE(profiler_comp, get_profiler_name(TRUE, bpp))
|
PROFILER_CREATE(profiler_comp, get_profiler_name(TRUE, bpp))
|
||||||
PROFILER_CREATE(profiler_decomp, get_profiler_name(FALSE, bpp))
|
PROFILER_CREATE(profiler_decomp, get_profiler_name(FALSE, bpp))
|
||||||
|
|
||||||
for (x = 0; x < 500; x++)
|
for (x = 0; x < 50; x++)
|
||||||
{
|
{
|
||||||
if (!run_encode_decode_single(bpp, encoder, decoder
|
if (!run_encode_decode_single(bpp, encoder, decoder
|
||||||
#if defined(WITH_PROFILER)
|
#if defined(WITH_PROFILER)
|
||||||
|
@ -5547,9 +5547,9 @@ static BOOL RunTestPlanarSingleColor(BITMAP_PLANAR_CONTEXT* planar, const UINT32
|
|||||||
FreeRDPGetColorFormatName(dstFormat));
|
FreeRDPGetColorFormatName(dstFormat));
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
for (j = 0; j < 100; j += 8)
|
for (j = 0; j < 32; j += 8)
|
||||||
{
|
{
|
||||||
for (i = 4; i < 64; i += 8)
|
for (i = 4; i < 32; i += 8)
|
||||||
{
|
{
|
||||||
UINT32 compressedSize;
|
UINT32 compressedSize;
|
||||||
const UINT32 fill = j;
|
const UINT32 fill = j;
|
||||||
@ -5670,7 +5670,7 @@ static BOOL FuzzPlanar(void)
|
|||||||
if (!planar)
|
if (!planar)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
for (x = 0; x < 10000; x++)
|
for (x = 0; x < 100; x++)
|
||||||
{
|
{
|
||||||
BYTE data[0x10000] = { 0 };
|
BYTE data[0x10000] = { 0 };
|
||||||
size_t dataSize = 0x10000;
|
size_t dataSize = 0x10000;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
static HANDLE s_sync = NULL;
|
static HANDLE s_sync = NULL;
|
||||||
|
|
||||||
static int runInstance(int argc, char* argv[], freerdp** inst)
|
static int runInstance(int argc, char* argv[], freerdp** inst, DWORD timeout)
|
||||||
{
|
{
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
RDP_CLIENT_ENTRY_POINTS clientEntryPoints;
|
RDP_CLIENT_ENTRY_POINTS clientEntryPoints;
|
||||||
@ -25,6 +25,9 @@ static int runInstance(int argc, char* argv[], freerdp** inst)
|
|||||||
if (freerdp_client_settings_parse_command_line(context->settings, argc, argv, FALSE) < 0)
|
if (freerdp_client_settings_parse_command_line(context->settings, argc, argv, FALSE) < 0)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
|
if (!freerdp_settings_set_uint32(context->settings, FreeRDP_TcpConnectTimeout, timeout))
|
||||||
|
goto finish;
|
||||||
|
|
||||||
if (!freerdp_client_load_addins(context->channels, context->settings))
|
if (!freerdp_client_load_addins(context->channels, context->settings))
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
@ -52,14 +55,15 @@ finish:
|
|||||||
|
|
||||||
static int testTimeout(int port)
|
static int testTimeout(int port)
|
||||||
{
|
{
|
||||||
|
const DWORD timeout = 200;
|
||||||
DWORD start, end, diff;
|
DWORD start, end, diff;
|
||||||
char arg1[] = "/v:192.0.2.1:XXXXX";
|
char arg1[] = "/v:192.0.2.1:XXXXX";
|
||||||
char* argv[] = { "test", "/v:192.0.2.1:XXXXX", NULL };
|
char* argv[] = { "test", "/v:192.0.2.1:XXXXX" };
|
||||||
int rc;
|
int rc;
|
||||||
_snprintf(arg1, 18, "/v:192.0.2.1:%d", port);
|
_snprintf(arg1, 18, "/v:192.0.2.1:%d", port);
|
||||||
argv[1] = arg1;
|
argv[1] = arg1;
|
||||||
start = GetTickCount();
|
start = GetTickCount();
|
||||||
rc = runInstance(2, argv, NULL);
|
rc = runInstance(ARRAYSIZE(argv), argv, NULL, timeout);
|
||||||
end = GetTickCount();
|
end = GetTickCount();
|
||||||
|
|
||||||
if (rc != 1)
|
if (rc != 1)
|
||||||
@ -67,10 +71,10 @@ static int testTimeout(int port)
|
|||||||
|
|
||||||
diff = end - start;
|
diff = end - start;
|
||||||
|
|
||||||
if (diff > 16000)
|
if (diff > 4 * timeout)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (diff < 14000)
|
if (diff < timeout)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
printf("%s: Success!\n", __FUNCTION__);
|
printf("%s: Success!\n", __FUNCTION__);
|
||||||
@ -86,12 +90,12 @@ struct testThreadArgs
|
|||||||
static DWORD WINAPI testThread(LPVOID arg)
|
static DWORD WINAPI testThread(LPVOID arg)
|
||||||
{
|
{
|
||||||
char arg1[] = "/v:192.0.2.1:XXXXX";
|
char arg1[] = "/v:192.0.2.1:XXXXX";
|
||||||
char* argv[] = { "test", "/v:192.0.2.1:XXXXX", NULL };
|
char* argv[] = { "test", "/v:192.0.2.1:XXXXX" };
|
||||||
int rc;
|
int rc;
|
||||||
struct testThreadArgs* args = arg;
|
struct testThreadArgs* args = arg;
|
||||||
_snprintf(arg1, 18, "/v:192.0.2.1:%d", args->port);
|
_snprintf(arg1, 18, "/v:192.0.2.1:%d", args->port);
|
||||||
argv[1] = arg1;
|
argv[1] = arg1;
|
||||||
rc = runInstance(2, argv, args->arg);
|
rc = runInstance(ARRAYSIZE(argv), argv, args->arg, 5000);
|
||||||
|
|
||||||
if (rc != 1)
|
if (rc != 1)
|
||||||
ExitThread(-1);
|
ExitThread(-1);
|
||||||
@ -125,7 +129,7 @@ static int testAbort(int port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
WaitForSingleObject(s_sync, INFINITE);
|
WaitForSingleObject(s_sync, INFINITE);
|
||||||
Sleep(1000); /* Wait until freerdp_connect has been called */
|
Sleep(100); /* Wait until freerdp_connect has been called */
|
||||||
freerdp_abort_connect(instance);
|
freerdp_abort_connect(instance);
|
||||||
status = WaitForSingleObject(instance->context->abortEvent, 0);
|
status = WaitForSingleObject(instance->context->abortEvent, 0);
|
||||||
|
|
||||||
@ -211,8 +215,8 @@ static int testSuccess(int port)
|
|||||||
if (!CreateProcessA(exe, commandLine, NULL, NULL, FALSE, 0, NULL, wpath, &si, &process))
|
if (!CreateProcessA(exe, commandLine, NULL, NULL, FALSE, 0, NULL, wpath, &si, &process))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
Sleep(3 * 1000); /* let the server start */
|
Sleep(600); /* let the server start */
|
||||||
r = runInstance(argc, clientArgs, NULL);
|
r = runInstance(argc, clientArgs, NULL, 5000);
|
||||||
|
|
||||||
if (!TerminateProcess(process.hProcess, 0))
|
if (!TerminateProcess(process.hProcess, 0))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -57,6 +57,7 @@ static void test_dump_data(unsigned char* p, int len, int width, const char* nam
|
|||||||
{
|
{
|
||||||
unsigned char* line = p;
|
unsigned char* line = p;
|
||||||
int i, thisline, offset = 0;
|
int i, thisline, offset = 0;
|
||||||
|
return; // TODO: Activate this manually if required. Improves test speed
|
||||||
printf("\n%s[%d][%d]:\n", name, len / width, width);
|
printf("\n%s[%d][%d]:\n", name, len / width, width);
|
||||||
|
|
||||||
while (offset < len)
|
while (offset < len)
|
||||||
|
@ -263,7 +263,7 @@ int TestPrimitivesColors(int argc, char* argv[])
|
|||||||
PIXEL_FORMAT_XBGR32, PIXEL_FORMAT_RGBA32, PIXEL_FORMAT_RGBX32,
|
PIXEL_FORMAT_XBGR32, PIXEL_FORMAT_RGBA32, PIXEL_FORMAT_RGBX32,
|
||||||
PIXEL_FORMAT_BGRA32, PIXEL_FORMAT_BGRX32 };
|
PIXEL_FORMAT_BGRA32, PIXEL_FORMAT_BGRX32 };
|
||||||
DWORD x;
|
DWORD x;
|
||||||
prim_size_t roi = { 1920, 1080 };
|
prim_size_t roi = { 1920 / 4, 1080 / 4 };
|
||||||
WINPR_UNUSED(argc);
|
WINPR_UNUSED(argc);
|
||||||
WINPR_UNUSED(argv);
|
WINPR_UNUSED(argv);
|
||||||
prim_test_setup(FALSE);
|
prim_test_setup(FALSE);
|
||||||
|
@ -1720,6 +1720,8 @@ int TestPrimitivesYCbCr(int argc, char* argv[])
|
|||||||
const primitives_t* generics = primitives_get_generic();
|
const primitives_t* generics = primitives_get_generic();
|
||||||
UINT32 x;
|
UINT32 x;
|
||||||
|
|
||||||
|
WINPR_UNUSED(argv);
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -1757,13 +1759,13 @@ int TestPrimitivesYCbCr(int argc, char* argv[])
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
winpr_RAND((BYTE*)&roi.width, sizeof(roi.width));
|
winpr_RAND((BYTE*)&roi.width, sizeof(roi.width));
|
||||||
roi.width %= 2048;
|
roi.width %= 2048 / 4;
|
||||||
} while (roi.width < 16);
|
} while (roi.width < 16);
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
winpr_RAND((BYTE*)&roi.height, sizeof(roi.height));
|
winpr_RAND((BYTE*)&roi.height, sizeof(roi.height));
|
||||||
roi.height %= 2048;
|
roi.height %= 2048 / 4;
|
||||||
} while (roi.height < 16);
|
} while (roi.height < 16);
|
||||||
|
|
||||||
for (x = 0; x < sizeof(formats) / sizeof(formats[0]); x++)
|
for (x = 0; x < sizeof(formats) / sizeof(formats[0]); x++)
|
||||||
@ -1795,7 +1797,7 @@ int TestPrimitivesYCbCr(int argc, char* argv[])
|
|||||||
/* Do a performance run with full HD */
|
/* Do a performance run with full HD */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
prim_size_t roi = { 1928, 1080 };
|
prim_size_t roi = { 1928 / 8, 1080 / 8 };
|
||||||
|
|
||||||
for (x = 0; x < sizeof(formats) / sizeof(formats[0]); x++)
|
for (x = 0; x < sizeof(formats) / sizeof(formats[0]); x++)
|
||||||
{
|
{
|
||||||
|
@ -127,13 +127,13 @@ int TestPrimitivesYCoCg(int argc, char* argv[])
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
winpr_RAND((BYTE*)&w, sizeof(w));
|
winpr_RAND((BYTE*)&w, sizeof(w));
|
||||||
w %= 2048;
|
w %= 2048 / 4;
|
||||||
} while (w < 16);
|
} while (w < 16);
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
winpr_RAND((BYTE*)&h, sizeof(h));
|
winpr_RAND((BYTE*)&h, sizeof(h));
|
||||||
h %= 2048;
|
h %= 2048 / 4;
|
||||||
} while (h < 16);
|
} while (h < 16);
|
||||||
|
|
||||||
if (!test_YCoCgRToRGB_8u_AC4R_func(w, h))
|
if (!test_YCoCgRToRGB_8u_AC4R_func(w, h))
|
||||||
@ -141,8 +141,8 @@ int TestPrimitivesYCoCg(int argc, char* argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test once with full HD */
|
/* Test once with full HD/4 */
|
||||||
if (!test_YCoCgRToRGB_8u_AC4R_func(1920, 1080))
|
if (!test_YCoCgRToRGB_8u_AC4R_func(1920 / 4, 1080 / 4))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -863,7 +863,7 @@ int TestPrimitivesYUV(int argc, char* argv[])
|
|||||||
prim_test_setup(FALSE);
|
prim_test_setup(FALSE);
|
||||||
primitives_t* prims = primitives_get();
|
primitives_t* prims = primitives_get();
|
||||||
|
|
||||||
for (x = 0; x < 10; x++)
|
for (x = 0; x < 5; x++)
|
||||||
{
|
{
|
||||||
prim_size_t roi;
|
prim_size_t roi;
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ static DWORD WINAPI test_error_thread(LPVOID arg)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
dwErrorSet = (DWORD)rand();
|
dwErrorSet = (DWORD)abs(rand()) + 1;
|
||||||
SetLastError(dwErrorSet);
|
SetLastError(dwErrorSet);
|
||||||
if ((dwErrorGet = GetLastError()) != dwErrorSet)
|
if ((dwErrorGet = GetLastError()) != dwErrorSet)
|
||||||
{
|
{
|
||||||
@ -64,6 +64,9 @@ int TestErrorSetLastError(int argc, char* argv[])
|
|||||||
HANDLE threads[4];
|
HANDLE threads[4];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
WINPR_UNUSED(argc);
|
||||||
|
WINPR_UNUSED(argv);
|
||||||
|
|
||||||
/* We must initialize WLog here. It will check for settings
|
/* We must initialize WLog here. It will check for settings
|
||||||
* in the environment and if the variables are not set, the last
|
* in the environment and if the variables are not set, the last
|
||||||
* error state is changed... */
|
* error state is changed... */
|
||||||
@ -97,8 +100,8 @@ int TestErrorSetLastError(int argc, char* argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// let the threads run for at least 2 seconds
|
// let the threads run for at least 0.2 seconds
|
||||||
Sleep(2000);
|
Sleep(200);
|
||||||
bStopTest = TRUE;
|
bStopTest = TRUE;
|
||||||
|
|
||||||
WaitForSingleObject(threads[0], INFINITE);
|
WaitForSingleObject(threads[0], INFINITE);
|
||||||
|
@ -11,7 +11,7 @@ static SYNCHRONIZATION_BARRIER gBarrier;
|
|||||||
static HANDLE gStartEvent = NULL;
|
static HANDLE gStartEvent = NULL;
|
||||||
static LONG gErrorCount = 0;
|
static LONG gErrorCount = 0;
|
||||||
|
|
||||||
#define MAX_SLEEP_MS 32
|
#define MAX_SLEEP_MS 22
|
||||||
|
|
||||||
struct test_params
|
struct test_params
|
||||||
{
|
{
|
||||||
@ -181,7 +181,7 @@ int TestSynchBarrier(int argc, char* argv[])
|
|||||||
SYSTEM_INFO sysinfo;
|
SYSTEM_INFO sysinfo;
|
||||||
DWORD dwMaxThreads;
|
DWORD dwMaxThreads;
|
||||||
DWORD dwMinThreads;
|
DWORD dwMinThreads;
|
||||||
DWORD dwNumLoops = 200;
|
DWORD dwNumLoops = 10;
|
||||||
|
|
||||||
WINPR_UNUSED(argc);
|
WINPR_UNUSED(argc);
|
||||||
WINPR_UNUSED(argv);
|
WINPR_UNUSED(argv);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <winpr/thread.h>
|
#include <winpr/thread.h>
|
||||||
#include <winpr/interlocked.h>
|
#include <winpr/interlocked.h>
|
||||||
|
|
||||||
#define TEST_SYNC_CRITICAL_TEST1_RUNTIME_MS 500
|
#define TEST_SYNC_CRITICAL_TEST1_RUNTIME_MS 50
|
||||||
#define TEST_SYNC_CRITICAL_TEST1_RUNS 4
|
#define TEST_SYNC_CRITICAL_TEST1_RUNS 4
|
||||||
|
|
||||||
static CRITICAL_SECTION critical;
|
static CRITICAL_SECTION critical;
|
||||||
@ -86,6 +86,7 @@ static DWORD WINAPI TestSynchCritical_Test1(LPVOID arg)
|
|||||||
*/
|
*/
|
||||||
static DWORD WINAPI TestSynchCritical_Test2(LPVOID arg)
|
static DWORD WINAPI TestSynchCritical_Test2(LPVOID arg)
|
||||||
{
|
{
|
||||||
|
WINPR_UNUSED(arg);
|
||||||
if (TryEnterCriticalSection(&critical) == TRUE)
|
if (TryEnterCriticalSection(&critical) == TRUE)
|
||||||
{
|
{
|
||||||
LeaveCriticalSection(&critical);
|
LeaveCriticalSection(&critical);
|
||||||
@ -155,7 +156,7 @@ static DWORD WINAPI TestSynchCritical_Main(LPVOID arg)
|
|||||||
|
|
||||||
InitializeCriticalSection(&critical);
|
InitializeCriticalSection(&critical);
|
||||||
|
|
||||||
for (i = 0; i < 1000; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
if (critical.RecursionCount != i)
|
if (critical.RecursionCount != i)
|
||||||
{
|
{
|
||||||
@ -216,7 +217,7 @@ static DWORD WINAPI TestSynchCritical_Main(LPVOID arg)
|
|||||||
|
|
||||||
for (j = 0; j < TEST_SYNC_CRITICAL_TEST1_RUNS; j++)
|
for (j = 0; j < TEST_SYNC_CRITICAL_TEST1_RUNS; j++)
|
||||||
{
|
{
|
||||||
dwSpinCount = j * 1000;
|
dwSpinCount = j * 100;
|
||||||
InitializeCriticalSectionAndSpinCount(&critical, dwSpinCount);
|
InitializeCriticalSectionAndSpinCount(&critical, dwSpinCount);
|
||||||
|
|
||||||
gTestValueVulnerable = 0;
|
gTestValueVulnerable = 0;
|
||||||
@ -319,7 +320,7 @@ int TestSynchCritical(int argc, char* argv[])
|
|||||||
WINPR_UNUSED(argv);
|
WINPR_UNUSED(argv);
|
||||||
|
|
||||||
dwDeadLockDetectionTimeMs =
|
dwDeadLockDetectionTimeMs =
|
||||||
6 * TEST_SYNC_CRITICAL_TEST1_RUNTIME_MS * TEST_SYNC_CRITICAL_TEST1_RUNS;
|
2 * TEST_SYNC_CRITICAL_TEST1_RUNTIME_MS * TEST_SYNC_CRITICAL_TEST1_RUNS;
|
||||||
|
|
||||||
printf("Deadlock will be assumed after %" PRIu32 " ms.\n", dwDeadLockDetectionTimeMs);
|
printf("Deadlock will be assumed after %" PRIu32 " ms.\n", dwDeadLockDetectionTimeMs);
|
||||||
|
|
||||||
@ -337,12 +338,12 @@ int TestSynchCritical(int argc, char* argv[])
|
|||||||
* Workaround checking the value of bThreadTerminated which is passed in the thread arg
|
* Workaround checking the value of bThreadTerminated which is passed in the thread arg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < dwDeadLockDetectionTimeMs; i += 100)
|
for (i = 0; i < dwDeadLockDetectionTimeMs; i += 10)
|
||||||
{
|
{
|
||||||
if (bThreadTerminated)
|
if (bThreadTerminated)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
Sleep(100);
|
Sleep(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bThreadTerminated)
|
if (!bThreadTerminated)
|
||||||
|
@ -19,8 +19,12 @@ static BOOL CALLBACK TestOnceFunction(PINIT_ONCE once, PVOID param, PVOID* conte
|
|||||||
{
|
{
|
||||||
LONG calls = InterlockedIncrement(pTestOnceFunctionCalls) - 1;
|
LONG calls = InterlockedIncrement(pTestOnceFunctionCalls) - 1;
|
||||||
|
|
||||||
|
WINPR_UNUSED(once);
|
||||||
|
WINPR_UNUSED(param);
|
||||||
|
WINPR_UNUSED(context);
|
||||||
|
|
||||||
/* simulate execution time */
|
/* simulate execution time */
|
||||||
Sleep(100 + rand() % 400);
|
Sleep(30 + rand() % 40);
|
||||||
|
|
||||||
if (calls < TEST_NUM_FAILURES)
|
if (calls < TEST_NUM_FAILURES)
|
||||||
{
|
{
|
||||||
@ -40,6 +44,9 @@ static DWORD WINAPI TestThreadFunction(LPVOID lpParam)
|
|||||||
{
|
{
|
||||||
LONG calls;
|
LONG calls;
|
||||||
BOOL ok;
|
BOOL ok;
|
||||||
|
|
||||||
|
WINPR_UNUSED(lpParam);
|
||||||
|
|
||||||
InterlockedIncrement(pTestThreadFunctionCalls);
|
InterlockedIncrement(pTestThreadFunctionCalls);
|
||||||
if (WaitForSingleObject(hStartEvent, INFINITE) != WAIT_OBJECT_0)
|
if (WaitForSingleObject(hStartEvent, INFINITE) != WAIT_OBJECT_0)
|
||||||
{
|
{
|
||||||
@ -65,6 +72,9 @@ int TestSynchInit(int argc, char* argv[])
|
|||||||
DWORD i;
|
DWORD i;
|
||||||
BOOL result = FALSE;
|
BOOL result = FALSE;
|
||||||
|
|
||||||
|
WINPR_UNUSED(argc);
|
||||||
|
WINPR_UNUSED(argv);
|
||||||
|
|
||||||
pErrors = _aligned_malloc(sizeof(LONG), sizeof(LONG));
|
pErrors = _aligned_malloc(sizeof(LONG), sizeof(LONG));
|
||||||
pTestThreadFunctionCalls = _aligned_malloc(sizeof(LONG), sizeof(LONG));
|
pTestThreadFunctionCalls = _aligned_malloc(sizeof(LONG), sizeof(LONG));
|
||||||
pTestOnceFunctionCalls = _aligned_malloc(sizeof(LONG), sizeof(LONG));
|
pTestOnceFunctionCalls = _aligned_malloc(sizeof(LONG), sizeof(LONG));
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
static DWORD WINAPI test_thread(LPVOID arg)
|
static DWORD WINAPI test_thread(LPVOID arg)
|
||||||
{
|
{
|
||||||
long timeout = 300 + (rand() % 1000);
|
long timeout = 30 + (rand() % 100);
|
||||||
WINPR_UNUSED(arg);
|
WINPR_UNUSED(arg);
|
||||||
Sleep(timeout);
|
Sleep(timeout);
|
||||||
ExitThread(0);
|
ExitThread(0);
|
||||||
@ -62,7 +62,7 @@ static BOOL TestWaitForAll(void)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = WaitForMultipleObjects(THREADS, threads, TRUE, 50);
|
ret = WaitForMultipleObjects(THREADS, threads, TRUE, 10);
|
||||||
if (ret != WAIT_TIMEOUT)
|
if (ret != WAIT_TIMEOUT)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: WaitForMultipleObjects bWaitAll, timeout 50 failed, ret=%d\n",
|
fprintf(stderr, "%s: WaitForMultipleObjects bWaitAll, timeout 50 failed, ret=%d\n",
|
||||||
@ -135,7 +135,7 @@ static BOOL TestWaitOneTimeout(void)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = WaitForMultipleObjects(THREADS, threads, FALSE, 50);
|
ret = WaitForMultipleObjects(THREADS, threads, FALSE, 10);
|
||||||
if (ret != WAIT_TIMEOUT)
|
if (ret != WAIT_TIMEOUT)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: WaitForMultipleObjects timeout 50 failed, ret=%d\n", __FUNCTION__,
|
fprintf(stderr, "%s: WaitForMultipleObjects timeout 50 failed, ret=%d\n", __FUNCTION__,
|
||||||
|
@ -5,7 +5,8 @@
|
|||||||
|
|
||||||
static DWORD WINAPI test_thread(LPVOID arg)
|
static DWORD WINAPI test_thread(LPVOID arg)
|
||||||
{
|
{
|
||||||
Sleep(1000);
|
WINPR_UNUSED(arg);
|
||||||
|
Sleep(100);
|
||||||
ExitThread(0);
|
ExitThread(0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -14,6 +15,10 @@ int TestSynchThread(int argc, char* argv[])
|
|||||||
{
|
{
|
||||||
DWORD rc;
|
DWORD rc;
|
||||||
HANDLE thread;
|
HANDLE thread;
|
||||||
|
|
||||||
|
WINPR_UNUSED(argc);
|
||||||
|
WINPR_UNUSED(argv);
|
||||||
|
|
||||||
thread = CreateThread(NULL, 0, test_thread, NULL, 0, NULL);
|
thread = CreateThread(NULL, 0, test_thread, NULL, 0, NULL);
|
||||||
|
|
||||||
if (!thread)
|
if (!thread)
|
||||||
@ -64,7 +69,7 @@ int TestSynchThread(int argc, char* argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* TryJoin should now fail. */
|
/* TryJoin should now fail. */
|
||||||
rc = WaitForSingleObject(thread, 50);
|
rc = WaitForSingleObject(thread, 10);
|
||||||
|
|
||||||
if (WAIT_TIMEOUT != rc)
|
if (WAIT_TIMEOUT != rc)
|
||||||
{
|
{
|
||||||
|
@ -19,13 +19,15 @@ struct apc_data
|
|||||||
};
|
};
|
||||||
typedef struct apc_data APC_DATA;
|
typedef struct apc_data APC_DATA;
|
||||||
|
|
||||||
VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
|
static VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
|
||||||
{
|
{
|
||||||
UINT32 TimerTime;
|
UINT32 TimerTime;
|
||||||
APC_DATA* apcData;
|
APC_DATA* apcData;
|
||||||
UINT32 expectedTime;
|
UINT32 expectedTime;
|
||||||
UINT32 CurrentTime = GetTickCount();
|
UINT32 CurrentTime = GetTickCount();
|
||||||
|
|
||||||
|
WINPR_UNUSED(TimerOrWaitFired);
|
||||||
|
|
||||||
if (!lpParam)
|
if (!lpParam)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -40,7 +42,7 @@ VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
|
|||||||
" ExpectedTime: %" PRIu32 " Discrepancy: %" PRIu32 "\n",
|
" ExpectedTime: %" PRIu32 " Discrepancy: %" PRIu32 "\n",
|
||||||
apcData->TimerId, apcData->FireCount, TimerTime, expectedTime, TimerTime - expectedTime);
|
apcData->TimerId, apcData->FireCount, TimerTime, expectedTime, TimerTime - expectedTime);
|
||||||
|
|
||||||
Sleep(50);
|
Sleep(11);
|
||||||
|
|
||||||
if (apcData->FireCount == apcData->MaxFireCount)
|
if (apcData->FireCount == apcData->MaxFireCount)
|
||||||
{
|
{
|
||||||
@ -55,6 +57,9 @@ int TestSynchTimerQueue(int argc, char* argv[])
|
|||||||
HANDLE hTimers[TIMER_COUNT];
|
HANDLE hTimers[TIMER_COUNT];
|
||||||
APC_DATA apcData[TIMER_COUNT];
|
APC_DATA apcData[TIMER_COUNT];
|
||||||
|
|
||||||
|
WINPR_UNUSED(argc);
|
||||||
|
WINPR_UNUSED(argv);
|
||||||
|
|
||||||
hTimerQueue = CreateTimerQueue();
|
hTimerQueue = CreateTimerQueue();
|
||||||
|
|
||||||
if (!hTimerQueue)
|
if (!hTimerQueue)
|
||||||
@ -67,8 +72,8 @@ int TestSynchTimerQueue(int argc, char* argv[])
|
|||||||
{
|
{
|
||||||
apcData[index].TimerId = index;
|
apcData[index].TimerId = index;
|
||||||
apcData[index].StartTime = GetTickCount();
|
apcData[index].StartTime = GetTickCount();
|
||||||
apcData[index].DueTime = (index * 100) + 500;
|
apcData[index].DueTime = (index * 10) + 50;
|
||||||
apcData[index].Period = 1000;
|
apcData[index].Period = 100;
|
||||||
apcData[index].FireCount = 0;
|
apcData[index].FireCount = 0;
|
||||||
apcData[index].MaxFireCount = FIRE_COUNT;
|
apcData[index].MaxFireCount = FIRE_COUNT;
|
||||||
|
|
||||||
@ -79,9 +84,8 @@ int TestSynchTimerQueue(int argc, char* argv[])
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CreateTimerQueueTimer(&hTimers[index], hTimerQueue, (WAITORTIMERCALLBACK)TimerRoutine,
|
if (!CreateTimerQueueTimer(&hTimers[index], hTimerQueue, TimerRoutine, &apcData[index],
|
||||||
&apcData[index], apcData[index].DueTime, apcData[index].Period,
|
apcData[index].DueTime, apcData[index].Period, 0))
|
||||||
0))
|
|
||||||
{
|
{
|
||||||
printf("CreateTimerQueueTimer failed (%" PRIu32 ")\n", GetLastError());
|
printf("CreateTimerQueueTimer failed (%" PRIu32 ")\n", GetLastError());
|
||||||
return -1;
|
return -1;
|
||||||
@ -90,7 +94,7 @@ int TestSynchTimerQueue(int argc, char* argv[])
|
|||||||
|
|
||||||
for (index = 0; index < TIMER_COUNT; index++)
|
for (index = 0; index < TIMER_COUNT; index++)
|
||||||
{
|
{
|
||||||
if (WaitForSingleObject(apcData[index].CompletionEvent, 20000) != WAIT_OBJECT_0)
|
if (WaitForSingleObject(apcData[index].CompletionEvent, 2000) != WAIT_OBJECT_0)
|
||||||
{
|
{
|
||||||
printf("Failed to wait for timer queue timer #%" PRIu32 " (%" PRIu32 ")\n", index,
|
printf("Failed to wait for timer queue timer #%" PRIu32 " (%" PRIu32 ")\n", index,
|
||||||
GetLastError());
|
GetLastError());
|
||||||
|
@ -19,7 +19,7 @@ int TestSynchWaitableTimer(int argc, char* argv[])
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
due.QuadPart = -15000000LL; /* 1.5 seconds */
|
due.QuadPart = -1500000LL; /* 0.15 seconds */
|
||||||
|
|
||||||
if (!SetWaitableTimer(timer, &due, 0, NULL, NULL, 0))
|
if (!SetWaitableTimer(timer, &due, 0, NULL, NULL, 0))
|
||||||
{
|
{
|
||||||
@ -36,18 +36,18 @@ int TestSynchWaitableTimer(int argc, char* argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf("Timer Signaled\n");
|
printf("Timer Signaled\n");
|
||||||
status = WaitForSingleObject(timer, 2000);
|
status = WaitForSingleObject(timer, 200);
|
||||||
|
|
||||||
if (status != WAIT_TIMEOUT)
|
if (status != WAIT_TIMEOUT)
|
||||||
{
|
{
|
||||||
printf("WaitForSingleObject(timer, 2000) failure: Actual: 0x%08" PRIX32
|
printf("WaitForSingleObject(timer, 200) failure: Actual: 0x%08" PRIX32
|
||||||
", Expected: 0x%08X\n",
|
", Expected: 0x%08X\n",
|
||||||
status, WAIT_TIMEOUT);
|
status, WAIT_TIMEOUT);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
due.QuadPart = 0;
|
due.QuadPart = 0;
|
||||||
period = 1200; /* 1.2 seconds */
|
period = 120; /* 0.12 seconds */
|
||||||
|
|
||||||
if (!SetWaitableTimer(timer, &due, period, NULL, NULL, 0))
|
if (!SetWaitableTimer(timer, &due, period, NULL, NULL, 0))
|
||||||
{
|
{
|
||||||
|
@ -54,15 +54,15 @@ int TestSynchWaitableTimerAPC(int argc, char* argv[])
|
|||||||
if (!hTimer)
|
if (!hTimer)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
due.QuadPart = -1000 * 1000LL; /* 1 seconds */
|
due.QuadPart = -1000 * 100LL; /* 0.1 seconds */
|
||||||
apcData.StartTime = GetTickCount();
|
apcData.StartTime = GetTickCount();
|
||||||
bSuccess = SetWaitableTimer(hTimer, &due, 100, TimerAPCProc, &apcData, FALSE);
|
bSuccess = SetWaitableTimer(hTimer, &due, 10, TimerAPCProc, &apcData, FALSE);
|
||||||
|
|
||||||
if (!bSuccess)
|
if (!bSuccess)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* nothing shall happen after 1.2 second, because thread is not in alertable state */
|
/* nothing shall happen after 0.12 second, because thread is not in alertable state */
|
||||||
rc = WaitForSingleObject(g_Event, 1200);
|
rc = WaitForSingleObject(g_Event, 120);
|
||||||
if (rc != WAIT_TIMEOUT)
|
if (rc != WAIT_TIMEOUT)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
static DWORD WINAPI thread_func(LPVOID arg)
|
static DWORD WINAPI thread_func(LPVOID arg)
|
||||||
{
|
{
|
||||||
|
WINPR_UNUSED(arg);
|
||||||
|
|
||||||
/* exists of the thread the quickest as possible */
|
/* exists of the thread the quickest as possible */
|
||||||
ExitThread(0);
|
ExitThread(0);
|
||||||
return 0;
|
return 0;
|
||||||
@ -17,9 +19,12 @@ int TestThreadExitThread(int argc, char* argv[])
|
|||||||
DWORD waitResult;
|
DWORD waitResult;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
WINPR_UNUSED(argc);
|
||||||
|
WINPR_UNUSED(argv);
|
||||||
|
|
||||||
/* FIXME: create some noise to better guaranty the test validity and
|
/* FIXME: create some noise to better guaranty the test validity and
|
||||||
* decrease the number of loops */
|
* decrease the number of loops */
|
||||||
for (i = 0; i < 50000; i++)
|
for (i = 0; i < 5000; i++)
|
||||||
{
|
{
|
||||||
thread = CreateThread(NULL, 0, thread_func, NULL, 0, NULL);
|
thread = CreateThread(NULL, 0, thread_func, NULL, 0, NULL);
|
||||||
|
|
||||||
@ -29,7 +34,7 @@ int TestThreadExitThread(int argc, char* argv[])
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
waitResult = WaitForSingleObject(thread, 1000);
|
waitResult = WaitForSingleObject(thread, 100);
|
||||||
if (waitResult != WAIT_OBJECT_0)
|
if (waitResult != WAIT_OBJECT_0)
|
||||||
{
|
{
|
||||||
/* When the thread exits before the internal thread_list
|
/* When the thread exits before the internal thread_list
|
||||||
|
Loading…
Reference in New Issue
Block a user