windows-nt/Source/XPSP1/NT/multimedia/directx/dplay/dnet/common/osind.h
2020-09-26 16:20:57 +08:00

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__