/*++ Copyright (C) 1998-2001 Microsoft Corporation Module Name: Abstract: History: --*/ /////////////////////////////////////////////////////////////////// // // StressOps.cpp // /////////////////////////////////////////////////////////////////// #include "Refresher.h" #include "Agents.h" CBasicRefreshAgent::CBasicRefreshAgent() { m_pRef = 0; m_dwIterations = 0; m_dwPeriod = 0; m_hThread = 0; } CBasicRefreshAgent::~CBasicRefreshAgent() { } BOOL CBasicRefreshAgent::Create(CRefresher *pRef, DWORD dwIterations, DWORD dwPeriod, HANDLE hRefreshEvent) { m_hRefreshEvent = hRefreshEvent; m_pRef = pRef; m_dwPeriod = dwPeriod; m_dwIterations = dwIterations; m_bInfinite = (0 == dwIterations); if (m_dwIterations) { DWORD dwTID; m_hThread = CreateThread(NULL, 0, CBasicRefreshAgent::StressThreadEntry, (LPVOID)this, CREATE_SUSPENDED, &dwTID); InterlockedIncrement(&g_lRefThreadCount); } return (NULL != m_hThread); } void CBasicRefreshAgent::BeginStress() { if (m_hThread) ResumeThread(m_hThread); } void CBasicRefreshAgent::StressLoop() { DWORD dw = 0; while ((dw < m_dwIterations) || m_bInfinite) { if (!m_bInfinite) dw++; if (!m_pRef->Refresh()) break; if (m_dwPeriod) Sleep(m_dwPeriod); } } DWORD WINAPI CBasicRefreshAgent::StressThreadEntry(LPVOID lpParameter) { CBasicRefreshAgent *pStress = (CBasicRefreshAgent*)lpParameter; pStress->StressLoop(); if (InterlockedDecrement(&g_lRefThreadCount) == 0) if (pStress->m_hRefreshEvent) SetEvent(pStress->m_hRefreshEvent); return 0; } BOOL CRandomOpRefreshAgent::Create(CRefresher *pRef, DWORD dwPeriod) { CBasicRefreshAgent::Create(pRef, 0, dwPeriod, NULL); DWORD dwTID; m_hThreadAddRefs = CreateThread(NULL, 0, CRandomOpRefreshAgent::AddRefThreadEntry, (LPVOID)this, CREATE_SUSPENDED, &dwTID); m_hThreadRemoveRefs = CreateThread(NULL, 0, CRandomOpRefreshAgent::RemRefThreadEntry, (LPVOID)this, CREATE_SUSPENDED, &dwTID); return TRUE; } void CRandomOpRefreshAgent::BeginStress() { CBasicRefreshAgent::BeginStress(); } void CRandomOpRefreshAgent::StressLoop() { DWORD dw = 0; while ((dw < m_dwIterations) || m_bInfinite) { if (!m_bInfinite) dw++; if (!m_pRef->Refresh()) break; if (m_dwPeriod) Sleep(m_dwPeriod); } } DWORD WINAPI CRandomOpRefreshAgent::AddRefThreadEntry(LPVOID lpParameter) { CRandomOpRefreshAgent *pAgent = (CRandomOpRefreshAgent*)lpParameter; // If number of instances are lower than MAX_INST, then add instance then sleep for random period if (pAgent->m_pRef->GetNumObjects() < MAX_INST) pAgent->m_pRef->AddObject(L"root\\default", L"Win32_HiPerfCounter.Name=\"Inst_1\""); Sleep(0); return 0; } DWORD WINAPI CRandomOpRefreshAgent::RemRefThreadEntry(LPVOID lpParameter) { CRandomOpRefreshAgent *pAgent = (CRandomOpRefreshAgent*)lpParameter; // If number of instances are greater than MIN_INST, then remove instance then sleep for random period int nNumObj = pAgent->m_pRef->GetNumObjects(); if (nNumObj > MIN_INST) pAgent->m_pRef->RemoveObject(GetTickCount() % nNumObj); Sleep(0); return 0; }