Leaked source code of windows server 2003
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.
 
 
 
 
 
 

168 lines
9.2 KiB

/****************************************************************************/
/* Copyright(C) Microsoft Corporation 1998 */
/****************************************************************************/
/****************************************************************************/
/* */
/* CPU Cycle counter */
/* */
/****************************************************************************/
#if defined(OS_WIN32) && !defined(DC_DEBUG) && defined(_M_IX86) && defined(PERF)
/****************************************************************************/
/* */
/* CPU Cycle counter macros */
/* */
/****************************************************************************/
/****************************************************************************/
/* variables used to store the count */
/****************************************************************************/
#define MAX_FNS 12
/****************************************************************************/
/* Counter identifiers */
/****************************************************************************/
#define FC_MEM2SCRN_BITBLT 0
#define FC_DSTBLT_TYPE 1
#define FC_PATBLT_TYPE 2
#define FC_OPAQUERECT_TYPE 3
#define FC_SCRBLT_TYPE 4
#define FC_MEMBLT_TYPE 5
#define FC_LINETO_TYPE 6
#define FC_POLYLINE_TYPE 7
#define FC_INDEX_TYPE 8
#define FC_UHADDUPDATEREGION 9
#define FC_UHSETCLIPREGION 10
#define FC_UHPROCESSPALETTEPDU 11
#define FC_POLYGONSC_TYPE 12
#define FC_POLYGONCB_TYPE 13
#define FC_ELLIPSESC_TYPE 14
#define FC_ELLIPSECB_TYPE 15
#define FC_FAST_INDEX_TYPE 16
#define FC_FAST_GLYPH_TYPE 17
/****************************************************************************/
/* Routines to measure the count before and after */
/****************************************************************************/
#define TIMERSTART \
{ \
unsigned long startHi; \
unsigned long startLo; \
unsigned long endHi; \
unsigned long endLo; \
\
unsigned long timeLo; \
unsigned long timeHi; \
\
\
_asm mov eax,0 \
_asm mov edx,0 \
\
_asm _emit 0Fh \
_asm _emit 31h \
_asm mov startHi, edx \
_asm mov startLo, eax \
#define TIMERSTOP \
_asm mov eax,0 \
_asm mov edx,0 \
\
_asm _emit 0Fh \
_asm _emit 31h \
_asm mov endHi, edx \
_asm mov endLo, eax \
#define UPDATECOUNTER(fn) \
callCount[fn]++; \
\
if (endLo < startLo) \
{ \
timeLo = 0xFFFFFFFF - (startLo - endLo - 1); \
endHi--; \
} \
else \
{ \
timeLo = endLo - startLo; \
} \
\
timeHi = endHi - startHi; \
\
cycleCountLo[fn] = (unsigned long)(cycleCountLo[fn] + timeLo);\
\
if (cycleCountLo[fn] < timeLo) \
{ \
timeHi++; \
} \
\
cycleCountHi[fn] += timeHi; \
}
#define RESET_COUNTERS \
{ \
int idx; \
for (idx = 0; idx < MAX_FNS; idx++)\
{ \
callCount[idx] = 0; \
cycleCountHi[idx] = 0; \
cycleCountLo[idx] = 0; \
} \
\
OutputDebugString(_T("Counters Reset\n")); \
\
} \
#define OUTPUT_COUNTERS \
{ \
int idx; \
TCHAR result[80]; \
TCHAR fnNames[MAX_FNS][30] = \
{ \
_T("BitmapRect sub order *"), \
_T("DSTBLT order"), \
_T("PATBLT order"), \
_T("OPAQUERECT order"), \
_T("SCRBLT order"), \
_T("MEMBLT order **"), \
_T("LINETO order **"), \
_T("POLYLINE order"), \
_T("INDEX (glyph) order *"), \
_T("UHAddUpdateRegion *"), \
_T("UHSetClipRegion *"), \
_T("UHProcessPalettePDU *"), \
_T("POLYGONSC order"), \
_T("POLYGONCB order"), \
_T("ELLIPSESC order"), \
_T("ELLIPSECB order"), \
_T("FASTINDEX order"), \
_T("FASTGLYPH order")
}; \
\
OutputDebugString(_T("******************************************")\
_T("\n")); \
_stprintf(result, _T("%-29s %-6s %-12s %-12s\n"), _T("Operation"),\
_T("Hits"), _T("High cycles"), _T("Low cycles")); \
\
OutputDebugString(result); \
for (idx = 0; idx < MAX_FNS; idx++) \
{ \
_stprintf(result, _T("%-29s %6lu %12lu %12lu\n"), \
fnNames[idx], callCount[idx], \
cycleCountHi[idx], cycleCountLo[idx]); \
OutputDebugString(result); \
} \
OutputDebugString(_T("******************************************")\
_T("\n")); \
} \
#else
#define MAX_FNS
#define TIMERSTART
#define TIMERSTOP
#define UPDATECOUNTER(fn)
#define RESET_COUNTERS
#define OUTPUT_COUNTERS
#endif