Leaked source code of windows server 2003
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.
 
 
 
 
 
 

98 lines
2.9 KiB

/////////////////////////////////////////////////////////////////////////////////////
// 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