From 9a4fb396dabe23f7fb9a6165b55981191ee38bb5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 24 Jan 2014 18:08:06 -0500 Subject: [PATCH] libwinpr-synch: add unit test for waitable timer asynchronous procedure calls --- client/X11/generate_argument_docbook.c | 2 +- winpr/libwinpr/synch/test/CMakeLists.txt | 3 +- .../synch/test/TestSynchWaitableTimerAPC.c | 55 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c diff --git a/client/X11/generate_argument_docbook.c b/client/X11/generate_argument_docbook.c index 75bef5f..dd7b9d9 100644 --- a/client/X11/generate_argument_docbook.c +++ b/client/X11/generate_argument_docbook.c @@ -11,7 +11,7 @@ LPSTR tmp = NULL; -LPSTR tr_esc_str(LPSTR arg) +LPSTR tr_esc_str(LPCSTR arg) { size_t cs = 0, x, ds; size_t s; diff --git a/winpr/libwinpr/synch/test/CMakeLists.txt b/winpr/libwinpr/synch/test/CMakeLists.txt index cdda383..1d21af0 100644 --- a/winpr/libwinpr/synch/test/CMakeLists.txt +++ b/winpr/libwinpr/synch/test/CMakeLists.txt @@ -11,7 +11,8 @@ set(${MODULE_PREFIX}_TESTS TestSynchSemaphore.c TestSynchThread.c TestSynchTimerQueue.c - TestSynchWaitableTimer.c) + TestSynchWaitableTimer.c + TestSynchWaitableTimerAPC.c) create_test_sourcelist(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_DRIVER} diff --git a/winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c b/winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c new file mode 100644 index 0000000..ed34b3e --- /dev/null +++ b/winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c @@ -0,0 +1,55 @@ + +#include +#include + +HANDLE gDoneEvent; + +VOID CALLBACK TimerAPCProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue) +{ + int param; + + if (!lpArg) + return; + + param = *((int*) lpArg); + + printf("TimerAPCProc: %d\n", param); + + SetEvent(gDoneEvent); +} + +int TestSynchWaitableTimerAPC(int argc, char* argv[]) +{ + int arg = 123; + HANDLE hTimer; + BOOL bSuccess; + INT64 qwDueTime; + LARGE_INTEGER liDueTime; + + hTimer = CreateWaitableTimer(NULL, FALSE, NULL); + + if (!hTimer) + return -1; + + qwDueTime = -5 * 10000000; + liDueTime.LowPart = (DWORD) (qwDueTime & 0xFFFFFFFF); + liDueTime.HighPart = (LONG) (qwDueTime >> 32); + + bSuccess = SetWaitableTimer(hTimer, &liDueTime, 2000, TimerAPCProc, &arg, FALSE); + + if (!bSuccess) + return -1; + + if (WaitForSingleObject(gDoneEvent, INFINITE) != WAIT_OBJECT_0) + { + printf("WaitForSingleObject failed (%d)\n", GetLastError()); + return -1; + } + + CloseHandle(gDoneEvent); + + CloseHandle(hTimer); + + return 0; +} + -- 2.7.4