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.
 
 
 
 
 
 

187 lines
4.1 KiB

// This is a part of the Active Template Library.
// Copyright (C) 1996-2001 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Active Template Library Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Active Template Library product.
#ifndef ATLDEBUG_TRACE_MANAGER
#define ATLDEBUG_TRACE_MANAGER
#include "Allocate.h"
// Names
class CAtlTraceModuleInfo
{
public:
explicit CAtlTraceModuleInfo();
void Reset(HINSTANCE hInst);
HINSTANCE GetInstance() const {return m_hInst;}
const WCHAR *Path() const {return m_szPath;}
const WCHAR *Name() const {return m_szName;}
int m_iFirstCategory;
LONG m_nCategories;
private:
WCHAR m_szPath[MAX_PATH], m_szName[_MAX_FNAME];
HINSTANCE m_hInst;
};
class CAtlTraceSettings
{
public:
CAtlTraceSettings() :
m_nLevel(0),
m_eStatus(Inherit),
m_nRefCount(0),
m_nCookie(0)
{
}
UINT m_nLevel;
enum Status
{
Inherit = 0,
Enabled,
Disabled
};
Status m_eStatus;
// Only valid if (m_nRefCount > 0) && (m_nCookie != 0)
LONG m_nRefCount;
LONG m_nCookie;
public:
// Tries to mark the object as allocated. If the object is not available for allocation, returns false.
// Call this, then initialize the data, then call MarkValid. A successful TryAllocate gets a reference
// to the object
bool TryAllocate()
{
if( m_nCookie != 0 )
{
return( false );
}
LONG nNewRefCount = ::InterlockedIncrement( &m_nRefCount );
if( nNewRefCount == 1 )
{
// We are the first ones here
return( true );
}
return( false );
}
// Marks the object as valid.
void MarkValid( LONG nCookie )
{
ATLASSERT( nCookie != 0 );
m_nCookie = nCookie;
}
// Tries to get a reference to the object. If the object is invalid, returns false. Must call Release to
// release the reference after a successful TryAddRef
bool TryAddRef()
{
LONG nNewRefCount = ::InterlockedIncrement( &m_nRefCount );
if( (nNewRefCount > 1) && (m_nCookie != 0) )
{
// The object is valid, and we now own a reference to it
return( true );
}
else
{
Release();
return( false );
}
}
// Releases a reference to the object. If the objects refcount hits zero, the object is invalidated
void Release()
{
LONG nNewRefCount = ::InterlockedDecrement( &m_nRefCount );
if( nNewRefCount == 0 )
{
// We just released the last reference, so mark as invalid
m_nCookie = 0;
}
}
};
// Categories
class CAtlTraceCategory : public CAtlTraceSettings
{
public:
CAtlTraceCategory();
const WCHAR *Name() const {return m_szName;}
void Reset(const WCHAR *pszName, LONG nModuleCookie);
LONG m_nModuleCookie;
int m_iNextCategory;
private:
WCHAR m_szName[ATL_TRACE_MAX_NAME_SIZE];
};
// Modules (DLLs)
class CAtlTraceModule : public CAtlTraceModuleInfo, public CAtlTraceSettings
{
public:
typedef int (__cdecl *fnCrtDbgReport_t)(int,const CHAR *,int,const CHAR *,const CHAR *,...);
explicit CAtlTraceModule();
void CrtDbgReport(fnCrtDbgReport_t pfnCrtDbgReport);
fnCrtDbgReport_t CrtDbgReport() const {return m_pfnCrtDbgReport;}
private:
fnCrtDbgReport_t m_pfnCrtDbgReport;
};
// Process Info
class CAtlTraceProcess : public CAtlTraceModuleInfo
{
public:
explicit CAtlTraceProcess(DWORD_PTR dwMaxSize);
void Save(FILE *file, UINT nTabs) const;
bool Load(FILE *file);
UINT IncRef() {return ++m_nRef;}
UINT DecRef() {return --m_nRef;}
DWORD Id() const {return m_dwId;}
DWORD_PTR MaxSize() const {return m_dwMaxSize;}
void *Base() const {return m_pvBase;}
int ModuleCount() const {return m_nModuleCount;}
int CategoryCount() const {return m_nCategoryCount;}
void IncModuleCount( UINT nModules ) {m_nModuleCount += nModules;}
void IncCategoryCount( UINT nCategories ) {m_nCategoryCount += nCategories;}
LONG GetNextCookie();
DWORD_PTR m_dwFrontAlloc, m_dwBackAlloc, m_dwCurrFront, m_dwCurrBack;
UINT m_nLevel;
bool m_bLoaded, m_bEnabled, m_bFuncAndCategoryNames, m_bFileNameAndLineNo;
private:
DWORD m_dwId;
DWORD_PTR m_dwMaxSize;
UINT m_nRef;
void *m_pvBase;
UINT m_nModuleCount, m_nCategoryCount;
LONG m_nNextCookie;
};
#endif // ATLDEBUG_TRACE_MANAGER