338 lines
7 KiB
C++
338 lines
7 KiB
C++
/*++
|
|
|
|
Copyright (C) 1998-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Abstract:
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
//
|
|
// CRefTreeMain.cpp
|
|
//
|
|
// Created by a-dcrews, Oct. 6, 1998
|
|
//
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
#include "HiPerStress.h"
|
|
#include "Main.h"
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
//
|
|
// CMain
|
|
//
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
CMain::CMain()
|
|
{
|
|
}
|
|
|
|
CMain::~CMain()
|
|
{
|
|
m_apRootRef.RemoveAll();
|
|
}
|
|
|
|
BOOL CMain::Create()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
//
|
|
// CRefTreeMain
|
|
//
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
CRefTreeMain::CRefTreeMain()
|
|
{
|
|
}
|
|
|
|
CRefTreeMain::~CRefTreeMain()
|
|
{
|
|
m_apAgent.RemoveAll();
|
|
}
|
|
|
|
BOOL CRefTreeMain::Create(WCHAR *wcsRoot)
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Create locator and all root refreshers
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
{
|
|
if (!CMain::Create())
|
|
return FALSE;
|
|
|
|
// Create event
|
|
m_hRefreshEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
|
|
// Create all root refreshers
|
|
HKEY hKey;
|
|
WCHAR wcsSubKey[512];
|
|
DWORD dwIndex = 0,
|
|
dwSize = 512,
|
|
dwSubKey = dwSize;
|
|
|
|
// Enumerate all keys
|
|
HRESULT hRes = RegOpenKeyEx(HKEY_CURRENT_USER, wcsRoot, 0, KEY_READ, &hKey);
|
|
while (ERROR_NO_MORE_ITEMS != RegEnumKeyEx(hKey, dwIndex++, wcsSubKey, &dwSubKey, 0, NULL, 0, NULL))
|
|
{
|
|
// Look for refreshers
|
|
switch(*(_wcsupr(wcsSubKey)))
|
|
{
|
|
case L'R':
|
|
{
|
|
WCHAR wcsRefRoot[1024];
|
|
swprintf(wcsRefRoot, L"%s%s\\", wcsRoot, wcsSubKey);
|
|
CRefresher *pRef = CreateChildRefresher(wcsRefRoot);
|
|
|
|
m_apRootRef.Add(pRef);
|
|
}
|
|
}
|
|
dwSubKey = dwSize;
|
|
}
|
|
RegCloseKey(hKey);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
CRefresher* CRefTreeMain::CreateChildRefresher(WCHAR *wcsRegPath)
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Create refresher hierarchy and the stress object
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
{
|
|
CRefresher *pRef = new CRefresher;
|
|
if (!pRef->Create())
|
|
{
|
|
delete pRef;
|
|
return NULL;
|
|
}
|
|
|
|
HKEY hKey;
|
|
HRESULT hRes = RegOpenKeyEx(HKEY_CURRENT_USER, wcsRegPath, 0,
|
|
KEY_READ, &hKey);
|
|
if (hRes != ERROR_SUCCESS)
|
|
{
|
|
printf("**ERROR** Could not open the registry key: %s\n", wcsRegPath);
|
|
delete pRef;
|
|
return NULL;
|
|
}
|
|
|
|
AddChildren(hKey, wcsRegPath, pRef);
|
|
SetStressInfo(hKey, pRef);
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
return pRef;
|
|
}
|
|
|
|
BOOL CRefTreeMain::AddChildren(HKEY hKey, WCHAR *wcsRegPath, CRefresher *pRef)
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Add all child objects and refreshers
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
{
|
|
WCHAR wcsSubKey[1024];
|
|
|
|
const DWORD dwSize = 1024;
|
|
DWORD dwIndex = 0,
|
|
dwSubKey = dwSize;
|
|
|
|
while (ERROR_NO_MORE_ITEMS != RegEnumKeyEx(hKey, dwIndex++, wcsSubKey, &dwSubKey, 0, NULL, 0, NULL))
|
|
{
|
|
WCHAR wch;
|
|
swscanf(wcsSubKey, L"%c", &wch);
|
|
|
|
WCHAR wcsNewPath[1024];
|
|
swprintf(wcsNewPath, L"%s%s\\", wcsRegPath, wcsSubKey);
|
|
|
|
switch (*(_wcsupr(&wch)))
|
|
{
|
|
case L'R':
|
|
if (!pRef->AddRefresher(CreateChildRefresher(wcsNewPath)))
|
|
return FALSE;
|
|
break;
|
|
case L'O':
|
|
if (!AddObject(wcsNewPath, pRef))
|
|
return FALSE;
|
|
break;
|
|
}
|
|
dwSubKey = dwSize;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CRefTreeMain::AddObject(WCHAR *wcsNewPath, CRefresher *pRef)
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Obtain object and add it to refresher
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
{
|
|
HRESULT hRes;
|
|
HKEY hKey;
|
|
|
|
// Open the object's key
|
|
hRes = RegOpenKeyEx(HKEY_CURRENT_USER, wcsNewPath, 0, KEY_READ, &hKey);
|
|
if (hRes != ERROR_SUCCESS)
|
|
{
|
|
printf("**ERROR** Could not open the registry key: %s\n", wcsNewPath);
|
|
return FALSE;
|
|
}
|
|
|
|
WCHAR wcsName[512],
|
|
wcsNameSpace[1024];
|
|
|
|
DWORD dwType,
|
|
dwName = 512,
|
|
dwNameSpace = 1024;
|
|
|
|
// Get the name of the object
|
|
hRes = RegQueryValueEx (hKey, 0, 0, &dwType,
|
|
(LPBYTE)wcsName, &dwName);
|
|
if (hRes != ERROR_SUCCESS)
|
|
{
|
|
printf("**ERROR** Could not open the registry key: %S%S\n", wcsNewPath, L"<default>");
|
|
return FALSE;
|
|
}
|
|
|
|
// Get the name of the namespace
|
|
hRes = RegQueryValueEx (hKey, L"NameSpace", 0, &dwType,
|
|
(LPBYTE)wcsNameSpace, &dwNameSpace);
|
|
if (hRes != ERROR_SUCCESS)
|
|
{
|
|
printf("**ERROR** Could not open the registry key: %s\n", wcsNewPath);
|
|
return FALSE;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
return pRef->AddObject(wcsNameSpace, wcsName);
|
|
}
|
|
|
|
BOOL CRefTreeMain::SetStressInfo(HKEY hKey, CRefresher *pRef)
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Get the stress information
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
{
|
|
DWORD dwIterations = 0,
|
|
dwWait = 0,
|
|
dwType = 0,
|
|
dwSize = 1024;
|
|
|
|
// Get the number of iterations for this refresher
|
|
RegQueryValueEx (hKey, L"Iterations", 0, &dwType,
|
|
(LPBYTE)&dwIterations, &dwSize);
|
|
dwSize = 4;
|
|
|
|
// Get the wait period between iterations
|
|
RegQueryValueEx (hKey, L"Wait", 0, &dwType,
|
|
(LPBYTE)&dwWait, &dwSize);
|
|
|
|
// Create the stress object and add it to the array
|
|
|
|
CBasicRefreshAgent *pAgent = new CBasicRefreshAgent;
|
|
pAgent->Create(pRef, dwIterations, dwWait, m_hRefreshEvent);
|
|
m_apAgent.Add(pAgent);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CRefTreeMain::Go()
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Print the refresher tree with all of the object parameters
|
|
// and values. Start the threads, wait for them all to terminate,
|
|
// and then print out the refresher tree and parameters again.
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
{
|
|
DumpTree();
|
|
|
|
printf("\nStressing...");
|
|
DWORD dwFinish,
|
|
dwStart = GetTickCount();
|
|
|
|
for (int i = 0; i < m_apAgent.GetSize(); i++)
|
|
m_apAgent[i]->BeginStress();
|
|
|
|
WaitForSingleObject(m_hRefreshEvent, INFINITE);
|
|
|
|
dwFinish = GetTickCount();
|
|
|
|
printf("Done Stressing.\n\n\n");
|
|
|
|
DumpTree();
|
|
|
|
DumpStats(dwFinish - dwStart);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CRefTreeMain::DumpTree()
|
|
{
|
|
for (int i = 0; i < m_apRootRef.GetSize(); i++)
|
|
{
|
|
WCHAR wcsPrefix[16];
|
|
if (i < (m_apRootRef.GetSize() - 1))
|
|
wcscpy(wcsPrefix, L"|");
|
|
else
|
|
wcscpy(wcsPrefix, L" ");
|
|
|
|
m_apRootRef[i]->DumpTree(wcsPrefix);
|
|
printf("%S\n", wcsPrefix);
|
|
}
|
|
}
|
|
|
|
void CRefTreeMain::DumpStats(DWORD dwDelta)
|
|
{
|
|
|
|
printf("\n\n\n");
|
|
printf(" Refresh Stats\n");
|
|
printf("==========================================================================\n");
|
|
printf(" Elapsed Time: %d msec\n", dwDelta);
|
|
printf("==========================================================================\n\n\n");
|
|
for (int i = 0; i < m_apRootRef.GetSize(); i++)
|
|
m_apRootRef[i]->DumpStats();
|
|
|
|
printf("\n\n");
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
//
|
|
// CRefTreeMain
|
|
//
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
CPoundMain::CPoundMain(long lNumRefs)
|
|
{
|
|
m_lNumRefs = lNumRefs;
|
|
}
|
|
|
|
CPoundMain::~CPoundMain()
|
|
{
|
|
}
|
|
|
|
BOOL CPoundMain::Create()
|
|
{
|
|
CMain::Create();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CPoundMain::Go()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|