123 lines
2.8 KiB
C++
123 lines
2.8 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2000.
|
|
//
|
|
// File: R U N D O W N . C P P
|
|
//
|
|
// Contents: RPC rundown support
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: mbend 12 Nov 2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
#include "rundown.h"
|
|
|
|
CSsdpRundownSupport CSsdpRundownSupport::s_instance;
|
|
|
|
CSsdpRundownSupport::CSsdpRundownSupport()
|
|
{
|
|
}
|
|
|
|
CSsdpRundownSupport::~CSsdpRundownSupport()
|
|
{
|
|
CLock lock(m_critSec);
|
|
RundownList::Iterator iter;
|
|
if(S_OK == m_rundownList.GetIterator(iter))
|
|
{
|
|
CRundownHelperBase ** ppBase = NULL;
|
|
while(S_OK == iter.HrGetItem(&ppBase))
|
|
{
|
|
delete *ppBase;
|
|
if(S_OK != iter.HrNext())
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
m_rundownList.Clear();
|
|
}
|
|
|
|
CSsdpRundownSupport & CSsdpRundownSupport::Instance()
|
|
{
|
|
return s_instance;
|
|
}
|
|
|
|
void CSsdpRundownSupport::RemoveRundownItem(void * pvItem)
|
|
{
|
|
CRundownHelperBase * pBase = NULL;
|
|
{
|
|
CLock lock(m_critSec);
|
|
RundownList::Iterator iter;
|
|
if(S_OK == m_rundownList.GetIterator(iter))
|
|
{
|
|
CRundownHelperBase ** ppBase = NULL;
|
|
while(S_OK == iter.HrGetItem(&ppBase))
|
|
{
|
|
if((*ppBase)->IsMatch(pvItem))
|
|
{
|
|
pBase = *ppBase;
|
|
iter.HrErase();
|
|
break;
|
|
}
|
|
if(S_OK != iter.HrNext())
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(pBase)
|
|
{
|
|
delete pBase;
|
|
}
|
|
}
|
|
|
|
void CSsdpRundownSupport::DoRundown(void * pvItem)
|
|
{
|
|
CRundownHelperBase * pBase = NULL;
|
|
{
|
|
CLock lock(m_critSec);
|
|
RundownList::Iterator iter;
|
|
if(S_OK == m_rundownList.GetIterator(iter))
|
|
{
|
|
CRundownHelperBase ** ppBaseIter = NULL;
|
|
while(S_OK == iter.HrGetItem(&ppBaseIter))
|
|
{
|
|
if((*ppBaseIter)->IsMatch(pvItem))
|
|
{
|
|
pBase = *ppBaseIter;
|
|
iter.HrErase();
|
|
break;
|
|
}
|
|
if(S_OK != iter.HrNext())
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(pBase)
|
|
{
|
|
pBase->OnRundown();
|
|
delete pBase;
|
|
TraceTag(ttidSsdpRpcIf, "Rundown called for %p", pvItem);
|
|
}
|
|
}
|
|
|
|
HRESULT CSsdpRundownSupport::HrAddItemInternal(CRundownHelperBase * pBase)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
CLock lock(m_critSec);
|
|
hr = m_rundownList.HrPushFrontTransfer(pBase);
|
|
|
|
TraceHr(ttidError, FAL, hr, FALSE, "CSsdpRundownSupport::HrAddItemInternal");
|
|
return hr;
|
|
}
|
|
|