FreeRDP/winpr/libwinpr/synch/test/TestSynchTimerQueue.c

115 lines
2.4 KiB
C
Raw Normal View History

2014-01-25 02:48:55 +04:00
#include <winpr/crt.h>
#include <winpr/sysinfo.h>
2014-01-25 02:48:55 +04:00
#include <winpr/synch.h>
#define FIRE_COUNT 5
#define TIMER_COUNT 5
static int g_Count = 0;
static HANDLE g_Event = NULL;
struct apc_data
{
int TimerId;
int FireCount;
DWORD DueTime;
DWORD Period;
UINT32 StartTime;
};
typedef struct apc_data APC_DATA;
2014-01-25 02:48:55 +04:00
VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
UINT32 TimerTime;
APC_DATA* apcData;
UINT32 expectedTime;
UINT32 CurrentTime = GetTickCount();
2014-01-25 02:48:55 +04:00
if (!lpParam)
return;
apcData = (APC_DATA*) lpParam;
TimerTime = CurrentTime - apcData->StartTime;
expectedTime = apcData->DueTime + (apcData->Period * apcData->FireCount);
apcData->FireCount++;
g_Count++;
2014-01-25 02:48:55 +04:00
printf("TimerRoutine: TimerId: %d FireCount: %d ActualTime: %d ExpectedTime: %d Discrepancy: %d\n",
apcData->TimerId, apcData->FireCount, TimerTime, expectedTime, TimerTime - expectedTime);
if (g_Count >= (TIMER_COUNT * FIRE_COUNT))
{
SetEvent(g_Event);
}
Sleep(50);
2014-01-25 02:48:55 +04:00
}
int TestSynchTimerQueue(int argc, char* argv[])
{
int index;
HANDLE hTimerQueue;
HANDLE hTimers[TIMER_COUNT];
APC_DATA apcData[TIMER_COUNT];
2014-01-25 02:48:55 +04:00
g_Event = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!g_Event)
{
printf("CreateEvent failed (%d)\n", (int) GetLastError());
return -1;
}
2014-01-25 02:48:55 +04:00
hTimerQueue = CreateTimerQueue();
if (!hTimerQueue)
{
printf("CreateTimerQueue failed (%d)\n", (int) GetLastError());
2014-01-25 02:48:55 +04:00
return -1;
}
for (index = 0; index < TIMER_COUNT; index++)
2014-01-25 02:48:55 +04:00
{
apcData[index].TimerId = index;
apcData[index].StartTime = GetTickCount();
apcData[index].DueTime = (index * 100) + 500;
apcData[index].Period = 1000;
apcData[index].FireCount = 0;
if (!CreateTimerQueueTimer(&hTimers[index], hTimerQueue, (WAITORTIMERCALLBACK) TimerRoutine,
&apcData[index], apcData[index].DueTime, apcData[index].Period, 0))
{
printf("CreateTimerQueueTimer failed (%d)\n", (int) GetLastError());
return -1;
}
2014-01-25 02:48:55 +04:00
}
if (WaitForSingleObject(g_Event, INFINITE) != WAIT_OBJECT_0)
2014-01-25 02:48:55 +04:00
{
printf("WaitForSingleObject failed (%d)\n", (int) GetLastError());
2014-01-25 02:48:55 +04:00
return -1;
}
for (index = 0; index < TIMER_COUNT; index++)
{
if (!DeleteTimerQueueTimer(hTimerQueue, hTimers[index], NULL))
{
printf("DeleteTimerQueueTimer failed (%d)\n", (int) GetLastError());
return -1;
}
}
2014-01-25 02:48:55 +04:00
if (!DeleteTimerQueue(hTimerQueue))
{
printf("DeleteTimerQueue failed (%d)\n", (int) GetLastError());
2014-01-25 02:48:55 +04:00
return -1;
}
CloseHandle(g_Event);
2014-01-25 02:48:55 +04:00
return 0;
}