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.
 
 
 
 
 
 

131 lines
4.5 KiB

/******************************Module*Header*******************************\
* Module Name: timer.cxx
*
* For profiling
*
* Warning!
*
* In its present form, this profiler will work only for single
* threads of execution.
*
* Created: 13-Oct-1994 10:01:42
* Author: Kirk Olynyk [kirko]
*
* Copyright (c) 1994-1999 Microsoft Corporation
*
\**************************************************************************/
#include "precomp.hxx"
#if DBG
FLONG TIMER::fl = 0; // set 0'th bit to start timing
char *TIMER::pszRecordingFile = 0; // set to "c:\timer.txt" or whatever
TIMER *TIMER::pCurrent = 0; // don't change this
/******************************Member*Function*****************************\
* TIMER::TIMER *
* *
* History: *
* Fri 14-Oct-1994 06:59:29 by Kirk Olynyk [kirko] *
* Wrote it. *
\**************************************************************************/
TIMER::TIMER(char *psz_)
{
if (fl & TIMER_MEASURE) {
psz = psz_;
pParent = pCurrent;
pCurrent = this;
NtQuerySystemTime((LARGE_INTEGER*)&llTick);
}
}
/******************************Member*Function*****************************\
* TIMER::~TIMER *
* *
* History: *
* Fri 14-Oct-1994 06:59:08 by Kirk Olynyk [kirko] *
* Wrote it. *
\**************************************************************************/
TIMER::~TIMER()
{
if (fl & TIMER_MEASURE) {
if (psz) {
TIMER *p;
CHAR ach[200];
LONGLONG ll;
NtQuerySystemTime((LARGE_INTEGER*)&ll);
// calculate the difference in 0.1 microsecond units
ll -= llTick;
// print the lowest 32 bits of ll -- this limits
// function calls to less than 429 seconds
// this time is placed on the far left of the screen
DbgPrint("%7u\t", (unsigned) ll / 100);
// CHAR *pch = ach + wsprintfA(ach, "%7u\t", (unsigned) ll / 100);
// indent one space for each parent that you have
for (p = pParent; p; p = p->pParent)
DbgPrint(" ");
//*pch++ = ' ';
// write the string after the indentation
DbgPrint(psz);
//pch += wsprintf(pch, "%s\n", psz);
// always write the result to the debugging screen
// DbgPrint("%s", ach);
// if a recording file has been specified then append
// the same string at the end of that file
if (pszRecordingFile) {
HANDLE hf;
ASSERTGDI(FALSE, "Timer Recording File broken for now\n");
// if (
// hf =
// CreateFileA(
// pszRecordingFile
// , GENERIC_WRITE
// , 0
// , 0
// , OPEN_ALWAYS
// , FILE_ATTRIBUTE_NORMAL
// , 0
// )
// ) {
// LONG l = 0;
// SetFilePointer(hf, 0, &l, FILE_END);
// WriteFile(hf, ach, pch - ach, (DWORD*) &l, 0);
// CloseHandle(hf);
// }
}
// before this TIMER dies, change the current pointer
// back to the parent
pCurrent = pParent;
// Put the parent TIMER's to sleep during the time that
// this TIMER was in scope.
// unfortunately this does not compensate the parents
// for the this last little bit of copying .. oh well
NtQuerySystemTime((LARGE_INTEGER*)&ll);
ll -= llTick;
for (p = pParent; p; p = p->pParent)
p->llTick += ll;
}
}
}
#endif