Listing 2
#include "lightTraceAPI.h"
#include "cnvntionalTraceAPI.h"
#include "tracerThreadObj.h"
#include <iostream.h>
#define NUM_THREADS 64
HANDLE g_hRunThreadEvent = NULL;
// event for synchronizing threads
FILE* g_pCnvntionalTraceFile = NULL;
// log file for conventional trace
CRITICAL_SECTION g_cnvntlTraceFileCritSec;
// synchronize access to log file
// thread that produces traces
DWORD WINAPI ThreadProc(LPVOID pParam)
{
BOOL bLightTrace = (BOOL)pParam;
WaitForSingleObject(g_hRunThreadEvent, INFINITE);
for (int i = 0; i < 250; i++)
{
if (bLightTrace)
LightTrace(eTraceLevelInfo, "trace number %d", i);
else
CnvntionalTrace(eTraceLevelInfo, "trace number %d", i);
}
return 0;
};
// tester function
void TestTrace(BOOL bLightTrace)
{
DWORD dwThreadId = 0;
DWORD dwStart = 0;
DWORD dwEnd = 0;
HANDLE hThread[NUM_THREADS];
ResetEvent(g_hRunThreadEvent);
for (int i = 0; i < NUM_THREADS; i++)
{
hThread[i] = CreateThread(NULL, 0,
ThreadProc, (LPVOID)bLightTrace, 0, &dwThreadId);
SetThreadPriority(hThread[i], THREAD_PRIORITY_HIGHEST);
}
Sleep(1000);
dwStart = GetTickCount();
SetEvent(g_hRunThreadEvent);
WaitForMultipleObjects(NUM_THREADS,hThread,TRUE,INFINITE);
dwEnd = GetTickCount();
if (bLightTrace)
cout << "Light trace results =
" << dwEnd - dwStart << " tick counts" << endl;
else
cout << "Conventional trace results =
" << dwEnd - dwStart << " tick counts" << endl;
}
void main()
{
TracerThread tracerThread;
// init global params
g_hRunThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
InitializeCriticalSection(&g_cnvntlTraceFileCritSec);
g_pCnvntionalTraceFile = fopen("cnventionalTrace.txt", "w");
// run tracer thread (for light trace)
tracerThread.Run();
Sleep(2000);
// test
TestTrace(FALSE); // conventional trace
TestTrace(TRUE); // light trace
// cleanup before exit
DeleteCriticalSection(&g_cnvntlTraceFileCritSec);
fclose(g_pCnvntionalTraceFile);
}