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.
 
 
 
 
 
 

113 lines
2.8 KiB

//=============================================================================
//
// Copyright (c) 1996-1999, Microsoft Corporation, All rights reserved
//
// EQUEUE.CPP
//
// This file implements the classes for a queue of events which have matched
// some of the filters and will have to be dispatched.
//
// See equeue.h for documentation
//
// History:
//
// 11/27/96 a-levn Compiles.
//
//=============================================================================
#include "precomp.h"
#include <stdio.h>
#include "ess.h"
#include "equeue.h"
#include <cominit.h>
#include "NCEvents.h"
CEventQueue::CDeliverRequest::CDeliverRequest(CQueueingEventSink* pConsumer)
: m_pConsumer(pConsumer)
{
m_pConsumer->AddRef();
}
CEventQueue::CDeliverRequest::~CDeliverRequest()
{
m_pConsumer->Release();
}
HRESULT CEventQueue::CDeliverRequest::Execute()
{
return m_pConsumer->DeliverAll();
}
//*****************************************************************************
//************************ CEventQueue ****************************************
//*****************************************************************************
CEventQueue::CEventQueue(CEss* pEss) : m_pEss(pEss)
{
SetThreadLimits(100, 100, -1);
}
HRESULT CEventQueue::InitializeThread()
{
HRESULT hr;
if (FAILED(hr = CExecQueue::InitializeThread())) return hr;
//
// Report the MSFT_WmiThreadPoolThreadCreated event.
//
FIRE_NCEVENT( g_hNCEvents[MSFT_WmiThreadPoolThreadCreated],
WMI_SENDCOMMIT_SET_NOT_REQUIRED,
GetCurrentThreadId());
return S_OK;
}
void CEventQueue::UninitializeThread()
{
//
// Report the MSFT_WmiThreadPoolThreadDeleted event.
//
FIRE_NCEVENT( g_hNCEvents[MSFT_WmiThreadPoolThreadDeleted],
WMI_SENDCOMMIT_SET_NOT_REQUIRED,
GetCurrentThreadId() );
CExecQueue::UninitializeThread();
}
void CEventQueue::ThreadMain(CThreadRecord* pRecord)
{
try
{
CExecQueue::ThreadMain(pRecord);
}
catch(...)
{
// Exit this thread gracefully
// ===========================
ShutdownThread(pRecord);
}
}
HRESULT CEventQueue::EnqueueDeliver(CQueueingEventSink* pConsumer)
{
// Create a new request
// ====================
HRESULT hr;
CDeliverRequest* pRequest = new CDeliverRequest(pConsumer);
if(pRequest == NULL)
return WBEM_E_OUT_OF_MEMORY;
if FAILED(hr = CExecQueue::Enqueue(pRequest))
{
delete pRequest;
}
return hr;
}
void CEventQueue::DumpStatistics(FILE* f, long lFlags)
{
fprintf(f, "%d requests (%d threads) on the main queue\n", m_lNumRequests,
m_lNumThreads);
}