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.
 
 
 
 
 
 

118 lines
2.9 KiB

#include "precomp.h"
#include "mcinc.h"
#include "globals.h"
DWORD g_dwPerfFlags;
CRITICAL_SECTION CMarsGlobalCritSect::m_CS;
IGlobalInterfaceTable *CMarsGlobalsManager::ms_pGIT = NULL;
CMarsGlobalCritSect *CMarsGlobalsManager::m_pCS;
EXTERN_C HINSTANCE g_hinst = NULL;
EXTERN_C HINSTANCE g_hinstBorg = NULL;
HPALETTE g_hpalHalftone = NULL;
HANDLE g_hScriptEvents = INVALID_HANDLE_VALUE;
static LONG s_cProcessRef = 0;
static DWORD s_dwParkingThreadId = 0;
LONG ProcessAddRef()
{
InterlockedIncrement(&s_cProcessRef);
return s_cProcessRef;
}
LONG ProcessRelease()
{
ATLASSERT(s_cProcessRef > 0);
InterlockedDecrement(&s_cProcessRef);
if (s_cProcessRef == 0)
{
PostThreadMessage(s_dwParkingThreadId, WM_NULL, 0, 0);
}
return s_cProcessRef;
}
LONG GetProcessRefCount()
{
return s_cProcessRef;
}
void SetParkingThreadId(DWORD dwThreadId)
{
s_dwParkingThreadId = dwThreadId;
}
void CMarsGlobalsManager::Initialize(void)
{
// We have to use a pointer because we need
// the constructor to get called (the thing has a vtable) and that
// won't happen for global static objects since we're CRT-less.
m_pCS = new CMarsGlobalCritSect;
// We're REALLY in trouble if we can't get this thing created...
ATLASSERT(m_pCS);
}
void CMarsGlobalsManager::Teardown(void)
{
ATLASSERT(m_pCS);
if (m_pCS)
{
m_pCS->Enter();
}
if (NULL != ms_pGIT)
{
ms_pGIT->Release();
ms_pGIT = NULL;
}
// Leave before we delete the Critical Section object.
if (m_pCS)
{
m_pCS->Leave();
}
delete m_pCS;
}
//----------------------------------------------------------------------------
// Inform everyone who registered that it is time to clean up their globals
//----------------------------------------------------------------------------
HRESULT CMarsGlobalsManager::Passivate()
{
HRESULT hr = S_OK;
ATLASSERT(m_pCS);
CMarsAutoCSGrabber csGrabber(m_pCS);
return hr;
}
//----------------------------------------------------------------------------
// Return the Global Interface Table object
//----------------------------------------------------------------------------
IGlobalInterfaceTable *CMarsGlobalsManager::GIT(void)
{
ATLASSERT(m_pCS);
CMarsAutoCSGrabber csGrabber(m_pCS);
if (NULL == ms_pGIT)
{
HRESULT hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable, NULL, CLSCTX_INPROC_SERVER,
IID_IGlobalInterfaceTable, (void **)&ms_pGIT);
if (FAILED(hr))
{
ATLASSERT(false);
}
}
// NULL if there was a failure, non-NULL otherwise.
// NOTE: We are NOT returning an AddRef()'d pointer here!!! Caller cannot release.
return ms_pGIT;
} // GIT