Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

258 lines
7.0 KiB

///////////////////////////////////////////////////////////////////////////////
//
// File: tmutils.h
//
// Description: Useful Tepmlate Code, debugging stuff, general utilities
// used throughout the termmgr and MST
//
///////////////////////////////////////////////////////////////////////////////
//
// Note:
//
// use tm.h to define symbols shared throughout modules composing terminal
// manager
//
#ifndef ___TM_UTILS_INCLUDED___
#define ___TM_UTILS_INCLUDED___
#if defined(_DEBUG)
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
#define DECLARE_VQI() \
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject) = 0; \
STDMETHOD_(ULONG, AddRef)() = 0; \
STDMETHOD_(ULONG, Release)() = 0;
bool IsSameObject(IUnknown *pUnk1, IUnknown *pUnk2);
STDAPI_(void) TStringFromGUID(const GUID* pguid, LPTSTR pszBuf);
#ifdef UNICODE
#define WStringFromGUID TStringFromGUID
#else
STDAPI_(void) WStringFromGUID(const GUID* pguid, LPWSTR pszBuf);
#endif
void InitMediaType(AM_MEDIA_TYPE *pmt);
// We use ATL for our lists
// #include <atlapp.h>
// #define CList CSimpleArray
// We use our own assertions
#define ASSERT(x) TM_ASSERT(x)
// inline fns, macros
inline BOOL
HRESULT_FAILURE(
IN HRESULT HResult
)
{
// ZoltanS: We now consider S_FALSE to be success. Hopefully nothing
// depends on this...
// return (FAILED(HResult) || (S_FALSE == HResult));
return FAILED(HResult);
}
// ZoltanS: We now consider S_FALSE to be success. Hopefully nothing
// depends on this...
// if ( FAILED(LocalHResult) || (S_FALSE == LocalHResult) )
#define BAIL_ON_FAILURE(MacroHResult) \
{ \
HRESULT LocalHResult = MacroHResult ; \
if ( FAILED(LocalHResult) ) \
{ \
LOG((MSP_ERROR, "BAIL_ON_FAILURE - error %x", LocalHResult)); \
return LocalHResult; \
} \
}
// NULL is second - this way if an == operator
// is defined on Ptr, the operator may be used
#define BAIL_IF_NULL(Ptr, ReturnValue) \
{ \
void *LocalPtr = (void *)Ptr; \
if ( LocalPtr == NULL ) \
{ \
LOG((MSP_ERROR, "BAIL_IF_NULL - ret value %x", ReturnValue)); \
return ReturnValue; \
} \
}
// sets the first bit to indicate error
// sets the win32 facility code
// this is used instead of the HRESULT_FROM_WIN32 macro because that clears the customer flag
inline long
HRESULT_FROM_ERROR_CODE(
IN long ErrorCode
)
{
// LOG((MSP_ERROR, "HRESULT_FROM_ERROR_CODE - error %x", (0x80070000 | (0xa000ffff & ErrorCode))));
return ( 0x80070000 | (0xa000ffff & ErrorCode) );
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Better auto critical section lock
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// locks a critical section, and unlocks it automatically
// when the lock goes out of scope ONLY if (and as many times as)
// it holds it
// It may also be locked and unlocked independently
template <class T>
class LOCAL_CRIT_LOCK
{
public:
LOCAL_CRIT_LOCK(
IN T *plock
)
{
m_pLock = plock;
m_pLock->Lock();
NumLocksHeld = 1;
}
BOOL IsLocked(
)
{
return ( (NumLocksHeld > 0)? TRUE : FALSE );
}
void Lock(
)
{
m_pLock->Lock();
NumLocksHeld++;
}
void Unlock(
)
{
NumLocksHeld--;
m_pLock->Unlock();
}
~LOCAL_CRIT_LOCK(
)
{
while (IsLocked())
{
Unlock();
}
}
protected:
DWORD NumLocksHeld;
T *m_pLock;
private:
// make copy constructor and assignment operator inaccessible
LOCAL_CRIT_LOCK(
IN const LOCAL_CRIT_LOCK<T> &RefLocalLock
);
LOCAL_CRIT_LOCK<T> &operator=(const LOCAL_CRIT_LOCK<T> &RefLocalLock);
};
typedef LOCAL_CRIT_LOCK<CComObjectRoot> COM_LOCAL_CRIT_LOCK;
#ifdef DBG
//
// Declare methods to log the AddRef/Release calls and values
//
#define DECLARE_DEBUG_ADDREF_RELEASE(x) \
void LogDebugAddRef(DWORD dw) \
{ LOG((MSP_TRACE, "%s::AddRef() = %d", _T(#x), dw)); } \
void LogDebugRelease(DWORD dw) \
{ LOG((MSP_TRACE, "%s::Release() = %d", _T(#x), dw)); }
//
// Create a template class derived from CComObject to supply
// the debug logic.
//
template <class base>
class CTMComObject : public CComObject<base>
{
typedef CComObject<base> _BaseClass;
STDMETHOD_(ULONG, AddRef)()
{
DWORD dwR = _BaseClass::AddRef();
base::LogDebugAddRef(m_dwRef);
return dwR;
}
STDMETHOD_(ULONG, Release)()
{
DWORD dwRef = m_dwRef;
DWORD dwR = _BaseClass::Release();
LogDebugRelease(--dwRef);
return dwR;
}
};
#else // #ifdef DBG
#define DECLARE_DEBUG_ADDREF_RELEASE(x)
#endif // #ifdef DBG
// ??? why???
#ifndef __WXUTIL__
// locks a critical section, and unlocks it automatically
// when the lock goes out of scope
class CAutoObjectLock {
// make copy constructor and assignment operator inaccessible
CAutoObjectLock(const CAutoObjectLock &refAutoLock);
CAutoObjectLock &operator=(const CAutoObjectLock &refAutoLock);
protected:
CComObjectRoot * m_pObject;
public:
CAutoObjectLock(CComObjectRoot * pobject)
{
m_pObject = pobject;
m_pObject->Lock();
};
~CAutoObjectLock() {
m_pObject->Unlock();
};
};
#define AUTO_CRIT_LOCK CAutoObjectLock lck(this);
#ifdef _DEBUG
#define EXECUTE_ASSERT(_x_) TM_ASSERT(_x_)
#else
#define EXECUTE_ASSERT(_x_) _x_
#endif
// ??? why???
#endif // #ifndef __WXUTIL__
#endif // ___TM_UTILS_INCLUDED___
// eof