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.
|
|
/////////////////////////////////////////////////////////////////////////////////////
// bcastevent.cpp : Implementation of CBroadcastEventService
// Copyright (c) Microsoft Corporation 2001.
#include "stdafx.h"
#ifndef TUNING_MODEL_ONLY
#include "bcastevent.h"
DEFINE_EXTERN_OBJECT_ENTRY(CLSID_BroadcastEventService, CBroadcastEventService)
namespace BDATuningModel {
bool CReflectionThread::GetNextEvent(GUID& g) { CAutoLock lock(&m_WorkerLock); if (!m_FiringQ.size()) { return false; } g = m_FiringQ.front(); m_FiringQ.pop(); return true; }
void CReflectionThread::GetAdviseList(AdviseList& l) { CAutoLock lock(&m_WorkerLock); AdviseList::iterator i; for (i = m_AdviseList.begin(); i != m_AdviseList.end(); ++i) { l.push_back(*i); } ASSERT(m_AdviseList.size() == l.size()); // TRACELSM(TRACE_DEBUG, (dbgDump << "CReflectionThread::GetAdviseList() m_al = " << m_AdviseList.size() << " l = " << l.size()), "");
return; }
HRESULT CReflectionThread::Fire(PQGIT& pGIT) { GUID g; AdviseList l; GetAdviseList(l); while (GetNextEvent(g)) { for (AdviseList::iterator i = l.begin(); i != l.end(); ++i) { PQBroadcastEvent e; HRESULT hr = pGIT->GetInterfaceFromGlobal(*i, IID_IBroadcastEvent, reinterpret_cast<LPVOID*>(&e)); if (SUCCEEDED(hr) && e) { e->Fire(g); } } } return NOERROR; }
HRESULT CReflectionThread::Advise(PUnknown& p, DWORD *pdwCookie) { if (!m_pGIT) { HRESULT hr = m_pGIT.CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER); if (FAILED(hr)) { TRACELSM(TRACE_ERROR, (dbgDump << "CReflectionThread::Advise() can't create GIT. hr = " << hr), ""); return hr; } } ASSERT(m_pGIT); HRESULT hr = m_pGIT->RegisterInterfaceInGlobal(p, IID_IBroadcastEvent, pdwCookie); if (FAILED(hr)) { TRACELSM(TRACE_ERROR, (dbgDump << "CReflectionThread::Advise() can't register interface. hr = " << hr), ""); return hr; } CAutoLock lock(&m_WorkerLock); m_AdviseList.push_back(*pdwCookie);
return NOERROR; }
HRESULT CReflectionThread::Unadvise(DWORD dwCookie) { if (!m_pGIT) { // if no GIT yet, then they can't have advised yet
return E_INVALIDARG; } CAutoLock lock(&m_WorkerLock); AdviseList::iterator i = std::find(m_AdviseList.begin(), m_AdviseList.end(), dwCookie); if (i == m_AdviseList.end()) { return E_INVALIDARG; } m_AdviseList.erase(i); ASSERT(m_pGIT); HRESULT hr = m_pGIT->RevokeInterfaceFromGlobal(dwCookie); if (FAILED(hr)) { TRACELSM(TRACE_ERROR, (dbgDump << "CReflectionThread::Advise() can't register interface. hr = " << hr), ""); return hr; }
return NOERROR; }
}; // namespace
#endif //TUNING_MODEL_ONLY
// end of file - tuningspacecontainer.cpp
|