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.
|
|
/***************************************************************************\ * * File: BaseObject.inl * * History: * 11/05/1999: JStall: Created * * Copyright (C) 2000 by Microsoft Corporation. All rights reserved. * \***************************************************************************/
#if !defined(BASE__BaseObject_inl__INCLUDED) #define BASE__BaseObject_inl__INCLUDED #pragma once
#include "Locks.h"
//------------------------------------------------------------------------------ inline HANDLE GetHandle(const BaseObject * pbase) { if (pbase != NULL) { return pbase->GetHandle(); }
return NULL; }
/***************************************************************************\ ***************************************************************************** * * class BaseObject * ***************************************************************************** \***************************************************************************/
//------------------------------------------------------------------------------ inline BaseObject::BaseObject() { m_cRef = 1; // Start off with a valid reference }
//------------------------------------------------------------------------------ inline HANDLE BaseObject::GetHandle() const { return (HANDLE) this; }
//------------------------------------------------------------------------------ inline BaseObject * BaseObject::ValidateHandle(HANDLE h) { return (BaseObject *) h; }
#if DBG //------------------------------------------------------------------------------ inline void BaseObject::DEBUG_CheckValidLockCount() const { if (!DEBUG_IsZeroLockCountValid()) { AssertMsg(m_cRef > 0, "Object must have an outstanding reference."); } } #endif // DBG
//------------------------------------------------------------------------------ inline void BaseObject::Lock() { #if DBG DEBUG_CheckValidLockCount(); #endif // DBG
SafeIncrement(&m_cRef); }
/***************************************************************************\ * * BaseObject::xwUnlock * * xwUnlock() decrements the objects's usage count by 1. When the usage count * reaches 0, the object will be destroyed. * * NOTE: This function is designed to be called from the ResourceManager * and should not normally be called directly. * * <retval> Returns if the object is still valid (has not been destroyed)</retval> * \***************************************************************************/
inline BOOL BaseObject::xwUnlock() { #if DBG DEBUG_CheckValidLockCount(); #endif // DBG
#if DBG AssertMsg((this != s_DEBUG_pobjEnsure) || (m_cRef > 1), "Ensure Object is remains valid"); #endif // DBG
if (SafeDecrement(&m_cRef) == 0) { xwDestroy(); return FALSE; }
return TRUE; }
//------------------------------------------------------------------------------ inline BOOL BaseObject::xwUnlockNL(FinalUnlockProc pfnFinal, void * pvData) { #if DBG DEBUG_CheckValidLockCount(); #endif // DBG
#if DBG AssertMsg((this != s_DEBUG_pobjEnsure) || (m_cRef > 1), "Ensure Object is remains valid"); #endif // DBG
if (SafeDecrement(&m_cRef) == 0) { // // Object needs to be destroyed, so notify the caller so that it has // an opportunity to prepare. //
if (pfnFinal != NULL) { pfnFinal(this, pvData); }
xwDestroy(); return FALSE; }
return TRUE; }
/***************************************************************************\ ***************************************************************************** * * class ObjectLock * ***************************************************************************** \***************************************************************************/
//------------------------------------------------------------------------------ inline ObjectLock::ObjectLock(BaseObject * pobjLock) { AssertMsg(pobjLock->GetHandleType() != htContext, "Use ContextLock to lock a Context");
pobj = pobjLock; pobj->Lock();
#if DBG pobjLock->DEBUG_AssertValid(); #endif }
//------------------------------------------------------------------------------ inline ObjectLock::~ObjectLock() { pobj->xwUnlock(); }
#endif // BASE__BaseObject_inl__INCLUDED
|