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

152 lines
4.5 KiB
C

/*==========================================================================
*
* Copyright (C) 2001 Microsoft Corporation. All Rights Reserved.
*
* File: PerfMacs.h
* Content: Performance Instrumentation macros.
*
*
* History:
* Date By Reason
* ==== == ======
* 03/21/01 RichGr Created
*
* Usage:
* As Whistler/XP and DX 8.1 are now locked down for beta 2, this should
* not be included as part of the official builds. So just include this file
* temporarily when you need to instrument some functions.
* Specify these macros before and after what you want to time:
START_QPC
DoSomeWork
END_QPC
* Then temporarily change dndbg.cpp by replacing
this:
#include "dndbg.h"
#include "memlog.h"
#if defined(DEBUG)
with this:
#if defined(DPINST) && !defined(DEBUG)
#define DEBUG
#include "dndbg.h"
#include "memlog.h"
#undef DEBUG
#else
#include "dndbg.h"
#include "memlog.h"
#endif
#if defined(DEBUG) || defined(DPINST)
* To build the instrumented binaries, set C_DEFINES=-DDPINST in your razzle build
* environment. Both free and checked builds can be instrumented. If you want to
* put the bins in a different directory, set BUILD_ALT_DIR=i where 'i' is the character
* you want to append to \obj.
*
* To get useful results, you will usually need to use the shared memory
* log option (log=2 in win.ini) and run free binaries. If you run the checked
* binaries, you should keep the amount of debug output low.
*
*
***************************************************************************/
#ifndef __PERFMACS_H__
#define __PERFMACS_H__
#ifdef DEBUG
#define DPINST
#endif
#ifdef DPINST
#pragma message("DPINST is defined and binaries are instrumented")
#define DPINST_CRITSEC FALSE // Specify TRUE or FALSE
#ifdef __cplusplus
extern "C" {
#endif
//**********************************************************************
// Constant definitions
//**********************************************************************
// #undef and #define this again before the code you're timing
// if you want to change the logging threshold.
#define QPC_THRESHOLD 10 // 10 usecs
//**********************************************************************
// Macro definitions
//**********************************************************************
// To provide local scope for n64QPCStart and n64QPCEnd, QPC_START has
// an unbalanced open { and QPC_END has the balancing close }.
#define START_QPC \
{ \
__int64 n64QPCStart, n64QPCEnd, n64QPCDiff; \
if (g_bQPC_Not_Inited) \
{ \
QueryPerformanceFrequency((LARGE_INTEGER*)&g_n64QPCFrequency); \
g_bQPC_Not_Inited = FALSE; \
} \
QueryPerformanceCounter((LARGE_INTEGER*)&n64QPCStart);
// a) We can handle wraps.
// b) Below a certain threshold, we don't want to log the elapsed time.
// c) We don't compensate for thread switches.
#define END_QPC \
QueryPerformanceCounter((LARGE_INTEGER*)&n64QPCEnd); \
if (n64QPCEnd >= n64QPCStart) \
n64QPCDiff = n64QPCEnd - n64QPCStart; \
else \
n64QPCDiff = (0x7fffffffffffffff - n64QPCStart) + 1 + n64QPCEnd; \
n64QPCDiff = n64QPCDiff * 1000000 / g_n64QPCFrequency; \
if (n64QPCDiff < 0) \
n64QPCDiff = 0; \
if (n64QPCDiff >= QPC_THRESHOLD) \
DebugPrintfX(__FILE__, __LINE__, DPF_MODNAME, DPF_SUBCOMP, DPF_ERRORLEVEL, "%d usecs", (DWORD)n64QPCDiff); \
}
//**********************************************************************
// Redefinitions of existing macros
//**********************************************************************
#if DPINST_CRITSEC == TRUE
#undef DNEnterCriticalSection
#define DNEnterCriticalSection( arg ) DNTimeEnterCriticalSection( arg )
#endif
//**********************************************************************
// Global Variable definitions
//**********************************************************************
static __int64 g_n64QPCFrequency = 0;
static BOOL g_bQPC_Not_Inited = TRUE;
//**********************************************************************
// Function Prototypes
//**********************************************************************
void DebugPrintfX(LPCSTR szFile, DWORD dwLineNumber,LPCSTR szFnName, DWORD dwSubComp, volatile DWORD_PTR dwDetail, ...);
#ifdef __cplusplus
} //extern "C"
#endif
#else // NULL definition
#define START_QPC
#define END_QPC
#endif //#ifdef DPINST
#endif // __PERFMACS_H__