/*========================================================================== * * 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__