236 lines
7.1 KiB
C
236 lines
7.1 KiB
C
/*==========================================================================
|
|
*
|
|
* Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: OSInd.h
|
|
* Content: OS indirection functions to abstract OS specific items.
|
|
*
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 07/12/99 jtk Created
|
|
* 09/21/99 rodtoll Fixed for retail build
|
|
* 08/28/2000 masonb Voice Merge: Fix for code that only defines one of DEBUG, DBG, _DEBUG
|
|
* 08/28/2000 masonb Voice Merge: Added IsUnicodePlatform macro
|
|
*
|
|
***************************************************************************/
|
|
|
|
#ifndef __OSIND_H__
|
|
#define __OSIND_H__
|
|
|
|
#include "CallStack.h"
|
|
#include "ClassBilink.h"
|
|
|
|
|
|
//**********************************************************************
|
|
// Constant definitions
|
|
//**********************************************************************
|
|
|
|
//
|
|
// defines for resource tracking
|
|
//
|
|
|
|
// Make sure all variations of DEBUG are defined if any one is
|
|
#if defined(DEBUG) || defined(DBG) || defined(_DEBUG)
|
|
#if !defined(DBG)
|
|
#define DBG
|
|
#endif
|
|
#if !defined(DEBUG)
|
|
#define DEBUG
|
|
#endif
|
|
#if !defined(_DEBUG)
|
|
#define _DEBUG
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef DEBUG
|
|
#define DN_MEMORY_TRACKING
|
|
#define DN_CRITICAL_SECTION_TRACKING
|
|
#endif // DEBUG
|
|
|
|
#define DN_MEMORY_CALL_STACK_DEPTH 12
|
|
#define DN_CRITICAL_SECTION_CALL_STACK_DEPTH 10
|
|
|
|
//
|
|
// debug value for invalid thread ID
|
|
//
|
|
#define DN_INVALID_THREAD_ID -1
|
|
|
|
//**********************************************************************
|
|
// Macro definitions
|
|
//**********************************************************************
|
|
|
|
//**********************************************************************
|
|
// Structure definitions
|
|
//**********************************************************************
|
|
|
|
//
|
|
// critical section
|
|
//
|
|
typedef struct
|
|
{
|
|
CRITICAL_SECTION CriticalSection;
|
|
|
|
#ifdef DN_CRITICAL_SECTION_TRACKING
|
|
UINT_PTR OwningThreadID;
|
|
UINT_PTR MaxLockCount;
|
|
UINT_PTR LockCount;
|
|
CCallStack< DN_CRITICAL_SECTION_CALL_STACK_DEPTH > CallStack;
|
|
CCallStack< DN_CRITICAL_SECTION_CALL_STACK_DEPTH > AllocCallStack;
|
|
CBilink blCritSec;
|
|
#endif // DN_CRITICAL_SECTION_TRACKING
|
|
|
|
} DNCRITICAL_SECTION;
|
|
|
|
//
|
|
// DirectNet time variable. Currently 64-bit, but can be made larger
|
|
//
|
|
typedef union
|
|
{
|
|
UINT_PTR Time64;
|
|
|
|
struct
|
|
{
|
|
DWORD TimeLow;
|
|
DWORD TimeHigh;
|
|
} Time32;
|
|
} DN_TIME;
|
|
|
|
//**********************************************************************
|
|
// Variable definitions
|
|
//**********************************************************************
|
|
extern HANDLE g_hMemoryHeap;
|
|
|
|
//**********************************************************************
|
|
// Function prototypes
|
|
//**********************************************************************
|
|
|
|
//
|
|
// initialization functions
|
|
//
|
|
BOOL DNOSIndirectionInit( void );
|
|
void DNOSIndirectionDeinit( void );
|
|
|
|
//
|
|
// Function to get OS version. Supported returns:
|
|
// VER_PLATFORM_WIN32_WINDOWS - Win9x
|
|
// VER_PLATFORM_WIN32_NT - WinNT
|
|
// VER_PLATFORM_WIN32s - Win32s on Win3.1
|
|
// VER_PLATFORM_WIN32_CE - WinCE
|
|
//
|
|
UINT_PTR DNGetOSType( void );
|
|
BOOL DNOSIsXPOrGreater( void );
|
|
HINSTANCE DNGetApplicationInstance( void );
|
|
PSECURITY_ATTRIBUTES DNGetNullDacl();
|
|
|
|
#define IsUnicodePlatform (DNGetOSType() == VER_PLATFORM_WIN32_NT)
|
|
|
|
#define GETTIMESTAMP() timeGetTime()
|
|
|
|
//
|
|
// time functions
|
|
//
|
|
void DNTimeGet( DN_TIME *const pTimeDestination );
|
|
INT_PTR DNTimeCompare( const DN_TIME *const pTime1, const DN_TIME *const pTime2 );
|
|
void DNTimeAdd( const DN_TIME *const pTime1, const DN_TIME *const pTime2, DN_TIME *const pTimeResult );
|
|
void DNTimeSubtract( const DN_TIME *const pTime1, const DN_TIME *const pTime2, DN_TIME *const pTimeResult );
|
|
|
|
|
|
//
|
|
// CriticalSection functions
|
|
//
|
|
#ifdef DN_CRITICAL_SECTION_TRACKING
|
|
|
|
#define DNEnterCriticalSection( arg ) DNCSTrackEnterCriticalSection( arg )
|
|
#define DNLeaveCriticalSection( arg ) DNCSTrackLeaveCriticalSection( arg )
|
|
#define AssertCriticalSectionIsTakenByThisThread( pCS, Flag ) DNCSTrackCriticalSectionIsTakenByThisThread( pCS, Flag )
|
|
#define DebugSetCriticalSectionRecursionCount( pCS, Count ) DNCSTrackSetCriticalSectionRecursionCount( pCS, Count )
|
|
|
|
void DNCSTrackEnterCriticalSection( DNCRITICAL_SECTION *const pCriticalSection );
|
|
void DNCSTrackLeaveCriticalSection( DNCRITICAL_SECTION *const pCriticalSection );
|
|
void DNCSTrackSetCriticalSectionRecursionCount( DNCRITICAL_SECTION *const pCriticalSection, const UINT_PTR RecursionCount );
|
|
void DNCSTrackCriticalSectionIsTakenByThisThread( const DNCRITICAL_SECTION *const pCriticalSection, const BOOL fFlag );
|
|
|
|
#else // DN_CRITICAL_SECTION_TRACKING
|
|
|
|
#define AssertCriticalSectionIsTakenByThisThread( pCS, Flag )
|
|
#define DebugSetCriticalSectionRecursionCount( pCS, Count )
|
|
#define DNEnterCriticalSection( arg ) EnterCriticalSection( &((arg)->CriticalSection) )
|
|
#define DNLeaveCriticalSection( arg ) LeaveCriticalSection( &((arg)->CriticalSection) )
|
|
|
|
#endif // DN_CRITICAL_SECTION_TRACKING
|
|
|
|
BOOL DNInitializeCriticalSection( DNCRITICAL_SECTION *const pCriticalSection );
|
|
void DNDeleteCriticalSection( DNCRITICAL_SECTION *const pCriticalSection );
|
|
|
|
#ifdef DN_MEMORY_TRACKING
|
|
|
|
#define DNMalloc( size ) DNMemoryTrackHeapAlloc( size )
|
|
#define DNRealloc( pMemory, size ) DNMemoryTrackHeapReAlloc( pMemory, size )
|
|
#define DNFree( pData ) DNMemoryTrackHeapFree( pData )
|
|
|
|
void *DNMemoryTrackHeapAlloc( const UINT_PTR MemorySize );
|
|
void *DNMemoryTrackHeapReAlloc( void *const pMemory, const UINT_PTR MemorySize );
|
|
void DNMemoryTrackHeapFree( void *const pMemory );
|
|
void DNMemoryTrackDisplayMemoryLeaks( void );
|
|
void DNMemoryTrackingValidateMemory( void );
|
|
|
|
#else // DN_MEMORY_TRACKING
|
|
|
|
#define DNMalloc( size ) HeapAlloc( g_hMemoryHeap, 0, size )
|
|
#define DNRealloc( pMemory, size ) HeapReAlloc( g_hMemoryHeap, 0, pMemory, size )
|
|
#define DNFree( pData ) HeapFree( g_hMemoryHeap, 0, pData )
|
|
|
|
#endif // DN_MEMORY_TRACKING
|
|
|
|
//
|
|
// Memory functions
|
|
//
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// operator new - allocate memory for a C++ class
|
|
//
|
|
// Entry: Size of memory to allocate
|
|
//
|
|
// Exit: Pointer to memory
|
|
// NULL = no memory available
|
|
//
|
|
// Notes: This function is for classes only and will ASSERT on zero sized
|
|
// allocations! This function also doesn't do the whole proper class
|
|
// thing of checking for replacement 'new handlers' and will not throw
|
|
// an exception if allocation fails.
|
|
// ------------------------------
|
|
inline void* __cdecl operator new( size_t size )
|
|
{
|
|
return DNMalloc( size );
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// operator delete - deallocate memory for a C++ class
|
|
//
|
|
// Entry: Pointer to memory
|
|
//
|
|
// Exit: Nothing
|
|
//
|
|
// Notes: This function is for classes only and will ASSERT on NULL frees!
|
|
// ------------------------------
|
|
inline void __cdecl operator delete( void *pData )
|
|
{
|
|
//
|
|
// Voice and lobby currently try allocating 0 byte buffers, can't disable this check yet.
|
|
//
|
|
if( pData == NULL )
|
|
return;
|
|
|
|
DNFree( pData );
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
|
|
#endif // __OSIND_H__
|