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);
}