Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

337 lines
7.0 KiB

/*++
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;
}