237 lines
3.9 KiB
C++
237 lines
3.9 KiB
C++
|
// TestTrust.cpp : Defines the entry point for the console application.
|
||
|
//
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <tchar.h>
|
||
|
#include <logging.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
//#include <malloc.h> // use _alloc
|
||
|
|
||
|
const TCHAR TestQuitEvent[] = _T("B4715050-ED35-4a7c-894A-1DF04F4F7F27");
|
||
|
|
||
|
LOG_Process;
|
||
|
|
||
|
HANDLE g_QuitEvent = NULL;
|
||
|
long g_Cnt = 0;
|
||
|
|
||
|
void Randomize()
|
||
|
{
|
||
|
srand(GetTickCount());
|
||
|
}
|
||
|
|
||
|
int RandomNum(int _max)
|
||
|
{
|
||
|
int n = rand();
|
||
|
float f = (float)n / RAND_MAX;
|
||
|
n = (int) (f * _max);
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
inline bool ShouldQuit()
|
||
|
{
|
||
|
return (WaitForSingleObject(g_QuitEvent, 0) == WAIT_OBJECT_0);
|
||
|
}
|
||
|
|
||
|
|
||
|
void RandomGenLogs(int _max)
|
||
|
{
|
||
|
LOG_Block("WriteLog");
|
||
|
|
||
|
Randomize();
|
||
|
|
||
|
for (int i = 0; i < RandomNum(_max); i++)
|
||
|
{
|
||
|
int n = RandomNum(10);
|
||
|
if (n >= 5)
|
||
|
{
|
||
|
if (RandomNum(2) > 1)
|
||
|
{
|
||
|
LOG_Error(_T("Error: %d"), RandomNum(100));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG_ErrorMsg(RandomNum(128));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch (n)
|
||
|
{
|
||
|
case 0:
|
||
|
LOG_XML(_T("XML Error"));
|
||
|
break;
|
||
|
case 1:
|
||
|
LOG_Driver(_T("Driver Log sample"));
|
||
|
break;
|
||
|
case 2:
|
||
|
LOG_Internet(_T("Internet related log"));
|
||
|
break;
|
||
|
case 3:
|
||
|
LOG_Software(_T("Software related log"));
|
||
|
break;
|
||
|
case 4:
|
||
|
LOG_Trust(_T("Trust related log"));
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD TestLog(int nDepth)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
char szTitle[16];
|
||
|
wsprintfA(szTitle, "TestLog(%d)", nDepth);
|
||
|
LOG_Block(szTitle);
|
||
|
|
||
|
Randomize();
|
||
|
|
||
|
if (ShouldQuit())
|
||
|
return 0;
|
||
|
|
||
|
if (nDepth <= 0)
|
||
|
{
|
||
|
RandomGenLogs(10);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
RandomGenLogs(4);
|
||
|
|
||
|
for (i = 0; i < RandomNum(2); i++)
|
||
|
{
|
||
|
if (ShouldQuit())
|
||
|
{
|
||
|
LOG_Out(_T("Got quit signal!"));
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
TestLog(nDepth - 1);
|
||
|
}
|
||
|
|
||
|
RandomGenLogs(6);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD WINAPI ThreadProc(LPVOID Param)
|
||
|
{
|
||
|
LOG_Block("ThreadProc");
|
||
|
|
||
|
InterlockedIncrement(&g_Cnt);
|
||
|
int n = (int) Param;
|
||
|
printf("\t\tThread %d starts with depth %d\n", GetCurrentThreadId(), n);
|
||
|
while (!ShouldQuit())
|
||
|
TestLog(n);
|
||
|
LOG_Out(_T("ThreadProc:::::::::Got quit signal!"));
|
||
|
printf("\t\tThread %d quits\n", GetCurrentThreadId());
|
||
|
InterlockedDecrement(&g_Cnt);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
void StartThreadTesting(int nTotalThreads)
|
||
|
{
|
||
|
LOG_Block("StartThreadTesting()");
|
||
|
DWORD dwThreadId;
|
||
|
int Num, i;
|
||
|
|
||
|
HANDLE* pHandles = (HANDLE*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nTotalThreads * sizeof(HANDLE));
|
||
|
|
||
|
Randomize();
|
||
|
|
||
|
for (i = 0; i < nTotalThreads; i++)
|
||
|
{
|
||
|
Num = RandomNum(6);
|
||
|
//LOG_Out(_T("Generate thread #%d with depth %d"), i, Num);
|
||
|
printf("\tGenerate thread #%d with depth %d\n", i, Num);
|
||
|
if (pHandles != NULL)
|
||
|
pHandles[i] = CreateThread(NULL, 0, ThreadProc, (LPVOID) Num, CREATE_SUSPENDED, &dwThreadId);
|
||
|
else
|
||
|
CreateThread(NULL, 0, ThreadProc, (LPVOID) Num, 0, &dwThreadId);
|
||
|
|
||
|
}
|
||
|
|
||
|
if (pHandles != NULL)
|
||
|
{
|
||
|
//
|
||
|
// start all threads
|
||
|
//
|
||
|
for (i = 0; i < nTotalThreads; i++)
|
||
|
{
|
||
|
ResumeThread(pHandles[i]);
|
||
|
}
|
||
|
HeapFree(GetProcessHeap(), 0, (LPVOID)pHandles);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
int main(int argc, char* argv[])
|
||
|
{
|
||
|
LOG_Block("main");
|
||
|
int nWaitSeconds = 5 * 1000;;
|
||
|
int nThreads= 20;
|
||
|
if (argc > 1)
|
||
|
{
|
||
|
nWaitSeconds = abs(atoi(argv[1])) * 1000;
|
||
|
}
|
||
|
LOG_Out(_T("Found timing %d seconds"), nWaitSeconds/1000);
|
||
|
if (argc > 2)
|
||
|
{
|
||
|
nThreads = abs(atoi(argv[2]));
|
||
|
}
|
||
|
LOG_Out(_T("Found number of threads: %d"), nThreads);
|
||
|
|
||
|
|
||
|
g_QuitEvent = CreateEvent(NULL, TRUE, FALSE, TestQuitEvent);
|
||
|
|
||
|
printf("Start threading ....\n");
|
||
|
|
||
|
StartThreadTesting(nThreads);
|
||
|
|
||
|
printf("Finished threading\n");
|
||
|
|
||
|
int iStart = (int)GetTickCount();
|
||
|
int nNow = (int)GetTickCount();
|
||
|
while (nNow < iStart + nWaitSeconds)
|
||
|
{
|
||
|
printf("Wait for %d more seconds...\n", (nWaitSeconds - (nNow - iStart))/1000);
|
||
|
Sleep(2000);
|
||
|
nNow = (int)GetTickCount();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// tell that we need to quit
|
||
|
//
|
||
|
SetEvent(g_QuitEvent);
|
||
|
|
||
|
//
|
||
|
// wait for threads to quit
|
||
|
//
|
||
|
int nCnt = g_Cnt;
|
||
|
iStart = (int)GetTickCount();
|
||
|
|
||
|
while (nCnt > 0)
|
||
|
{
|
||
|
Sleep(1000);
|
||
|
printf("Seconds: %d, Threads: %d\n", ((int)GetTickCount() - iStart)/1000, nCnt);
|
||
|
nCnt = g_Cnt;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// quit
|
||
|
//
|
||
|
return 0;
|
||
|
}
|