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.

358 lines
7.7 KiB

  1. /*++
  2. Copyright (c) 1997 Microsoft Corporation
  3. Module Name:
  4. perfdiag.hxx
  5. Abstract:
  6. Performance diagnostics
  7. Author:
  8. Richard L Firth (rfirth) 24-Jan-1997
  9. Revision History:
  10. 24-Jan-1997 rfirth
  11. Created
  12. --*/
  13. #if !defined(_PERFDIAG_)
  14. #define _PERFDIAG_
  15. //
  16. // perf event (PE_) definitions
  17. //
  18. //#define USE_ICECAP_FOR_DOWNLOAD_PROFILING 1
  19. #define PE_START 1
  20. #define PE_END 2
  21. #define PE_CLIENT_REQUEST_START 3
  22. #define PE_CLIENT_REQUEST_END 4
  23. #define PE_CLIENT_REQUEST_QUEUED 5
  24. #define PE_WORKER_REQUEST_START 6
  25. #define PE_WORKER_REQUEST_END 7
  26. #define PE_APP_CALLBACK_START 8
  27. #define PE_APP_CALLBACK_END 9
  28. #define PE_NAMERES_START 10
  29. #define PE_NAMERES_END 11
  30. #define PE_CONNECT_START 12
  31. #define PE_CONNECT_END 13
  32. #define PE_SEND_START 14
  33. #define PE_SEND_END 15
  34. #define PE_RECEIVE_START 16
  35. #define PE_RECEIVE_END 17
  36. #define PE_PEEK_RECEIVE_START 18
  37. #define PE_PEEK_RECEIVE_END 19
  38. #define PE_SOCKET_CLOSE_START 20
  39. #define PE_SOCKET_CLOSE_END 21
  40. #define PE_ACQUIRE_KEEP_ALIVE 22
  41. #define PE_RELEASE_KEEP_ALIVE 23
  42. #define PE_SOCKET_ERROR 24
  43. #define PE_CACHE_READ_CHECK_START 25
  44. #define PE_CACHE_READ_CHECK_END 26
  45. #define PE_CACHE_WRITE_CHECK_START 27
  46. #define PE_CACHE_WRITE_CHECK_END 28
  47. #define PE_CACHE_RETRIEVE_START 29
  48. #define PE_CACHE_RETRIEVE_END 30
  49. #define PE_CACHE_READ_START 31
  50. #define PE_CACHE_READ_END 32
  51. #define PE_CACHE_WRITE_START 33
  52. #define PE_CACHE_WRITE_END 34
  53. #define PE_CACHE_CREATE_FILE_START 35
  54. #define PE_CACHE_CREATE_FILE_END 36
  55. #define PE_CACHE_CLOSE_FILE_START 37
  56. #define PE_CACHE_CLOSE_FILE_END 38
  57. #define PE_CACHE_EXPIRY_CHECK_START 39
  58. #define PE_CACHE_EXPIRY_CHECK_END 40
  59. #define PE_YIELD_SELECT_START 41
  60. #define PE_YIELD_SELECT_END 42
  61. #define PE_YIELD_OBJECT_WAIT_START 43
  62. #define PE_YIELD_OBJECT_WAIT_END 44
  63. #define PE_YIELD_SLEEP_START 45
  64. #define PE_YIELD_SLEEP_END 46
  65. #define PE_TRACE 47
  66. #define PE_ENTER_PATH 48
  67. #define PE_LEAVE_PATH 49
  68. #define PE_TRACE_PATH 50
  69. //
  70. // API prototypes
  71. //
  72. #if defined(__cplusplus)
  73. extern "C" {
  74. #endif
  75. VOID
  76. #if defined(_WINX32_)
  77. __declspec(dllexport)
  78. #else
  79. __declspec(dllimport)
  80. #endif
  81. WINAPI
  82. WininetPerfLog(
  83. IN DWORD dwEvent,
  84. IN DWORD dwInfo1,
  85. IN DWORD dwInfo2,
  86. IN HINTERNET hInternet
  87. );
  88. #if defined(__cplusplus)
  89. }
  90. #endif
  91. #if defined(_WINX32_)
  92. #if defined(USE_PERF_DIAG)
  93. //
  94. // manifests
  95. //
  96. //#define DEFAULT_PE_LOG_RECORDS 4096
  97. #define DEFAULT_PE_LOG_RECORDS 16384
  98. //
  99. // types
  100. //
  101. typedef struct {
  102. LARGE_INTEGER liTime;
  103. DWORD dwThreadId;
  104. DWORD dwThreadPriority;
  105. HINTERNET hInternet;
  106. DWORD dwEvent;
  107. DWORD dwInfo;
  108. DWORD dwInfo2;
  109. } PERF_INFO, * LPPERF_INFO;
  110. //
  111. // prototypes
  112. //
  113. VOID
  114. PerfSleep(
  115. DWORD dwMilliseconds
  116. );
  117. int PerfSelect(
  118. int nfds,
  119. fd_set FAR * readfds,
  120. fd_set FAR * writefds,
  121. fd_set FAR * exceptfds,
  122. const struct timeval FAR * timeout
  123. );
  124. DWORD
  125. PerfWaitForSingleObject(
  126. HANDLE hObject,
  127. DWORD dwTimeout
  128. );
  129. //
  130. // classes
  131. //
  132. class CPerfDiag {
  133. private:
  134. LPBYTE m_lpbPerfBuffer;
  135. DWORD m_dwPerfBufferLen;
  136. LPBYTE m_lpbEnd;
  137. LPBYTE m_lpbNext;
  138. BOOL m_bFull;
  139. BOOL m_bStarted;
  140. BOOL m_bStartFinished;
  141. LARGE_INTEGER m_liStartTime;
  142. LPPERF_INFO get_next_record(VOID);
  143. VOID get_perf_time(PLARGE_INTEGER pTime) {
  144. QueryPerformanceCounter(pTime);
  145. }
  146. VOID get_time(LPPERF_INFO lpInfo) {
  147. get_perf_time(&lpInfo->liTime);
  148. }
  149. VOID free_perf_buffer(VOID) {
  150. if (m_lpbPerfBuffer) {
  151. m_lpbPerfBuffer = (LPBYTE)FREE_MEMORY(m_lpbPerfBuffer);
  152. INET_ASSERT(!m_lpbPerfBuffer);
  153. }
  154. }
  155. VOID perf_start(VOID) {
  156. while (!m_bStartFinished) {
  157. if (InterlockedExchange((LPLONG)&m_bStarted, TRUE) == FALSE) {
  158. get_perf_time(&m_liStartTime);
  159. Init();
  160. m_bStartFinished = TRUE;
  161. }
  162. if (!m_bStartFinished) {
  163. Sleep(0);
  164. }
  165. }
  166. }
  167. public:
  168. CPerfDiag();
  169. ~CPerfDiag();
  170. VOID Init(DWORD dwNumberOfRecords = DEFAULT_PE_LOG_RECORDS) {
  171. CreateBuffer(dwNumberOfRecords);
  172. }
  173. VOID CreateBuffer(LPBYTE lpbBuffer, DWORD dwBufferLength) {
  174. }
  175. VOID CreateBuffer(DWORD dwNumberOfRecords = DEFAULT_PE_LOG_RECORDS) {
  176. free_perf_buffer();
  177. m_dwPerfBufferLen = dwNumberOfRecords * sizeof(PERF_INFO);
  178. m_lpbPerfBuffer = (LPBYTE)ALLOCATE_MEMORY(LMEM_FIXED, m_dwPerfBufferLen);
  179. if (m_lpbPerfBuffer) {
  180. m_lpbEnd = m_lpbPerfBuffer + m_dwPerfBufferLen;
  181. m_lpbNext = m_lpbPerfBuffer;
  182. m_bFull = FALSE;
  183. } else {
  184. OutputDebugString("*** Cannot create performance buffer\n");
  185. }
  186. }
  187. VOID Log(DWORD dwEvent, DWORD dwInfo = 0);
  188. VOID Log(DWORD dwEvent, DWORD dwInfo, DWORD dwThreadId, HINTERNET hInternet);
  189. VOID Log(DWORD dwEvent, DWORD dwInfo, DWORD dwInfo2, DWORD dwThreadId, HINTERNET hInternet);
  190. VOID Dump(VOID);
  191. };
  192. //
  193. // global data
  194. //
  195. extern CPerfDiag * GlobalPerfDiag;
  196. //
  197. // macros
  198. //
  199. #define PERF_INIT() \
  200. if (!GlobalPerfDiag) GlobalPerfDiag = new CPerfDiag
  201. #define PERF_END() \
  202. if (GlobalPerfDiag) delete GlobalPerfDiag
  203. #define PERF_LOG \
  204. if (GlobalPerfDiag) GlobalPerfDiag->Log
  205. #define PERF_DUMP() \
  206. if (GlobalPerfDiag) GlobalPerfDiag->Dump()
  207. #define PERF_Sleep(n) \
  208. PerfSleep(n)
  209. #define PERF_Select(n, pReadfds, pWritefds, pExceptfds, pTimeout) \
  210. PerfSelect(n, pReadfds, pWritefds, pExceptfds, pTimeout)
  211. #define PERF_WaitForSingleObject(hObject, dwTimeout) \
  212. PerfWaitForSingleObject(hObject, dwTimeout)
  213. #else
  214. #define PERF_INIT() \
  215. /* NOTHING */
  216. #define PERF_END() \
  217. /* NOTHING */
  218. #define PERF_LOG \
  219. (VOID)
  220. #define PERF_DUMP() \
  221. /* NOTHING */
  222. #define PERF_Sleep(n) \
  223. Sleep(n)
  224. #define PERF_Select(n, pReadfds, pWritefds, pExceptfds, pTimeout) \
  225. _I_select(n, pReadfds, pWritefds, pExceptfds, pTimeout)
  226. #define PERF_WaitForSingleObject(hObject, dwTimeout) \
  227. WaitForSingleObject(hObject, dwTimeout)
  228. #endif // defined(USE_PERF_DIAG)
  229. #endif // defined(_WINX32_)
  230. //#define PERF_ENTER(Name) \
  231. // StartCAP()
  232. //#define PERF_LEAVE(Name) \
  233. // StopCAP()
  234. #if defined(USE_PERF_DIAG)
  235. #define PERF_LOG_EX \
  236. WininetPerfLog
  237. #define PERF_ID(Name) \
  238. (LPCSTR)(# Name)
  239. #define PERF_TRACE(Name, Info) \
  240. WininetPerfLog(PE_TRACE_PATH, Info, (DWORD)PERF_ID(Name), 0)
  241. #define PERF_ENTER(Name) \
  242. WininetPerfLog(PE_ENTER_PATH, 0, (DWORD)PERF_ID(Name), 0)
  243. #define PERF_LEAVE(Name) \
  244. WininetPerfLog(PE_LEAVE_PATH, 0, (DWORD)PERF_ID(Name), 0)
  245. #else
  246. #define PERF_LOG_EX \
  247. /* NOTHING */
  248. #define PERF_ID(Name) \
  249. /* NOTHING */
  250. #define PERF_TRACE(Name, Info) \
  251. /* NOTHING */
  252. #ifdef USE_ICECAP_FOR_DOWNLOAD_PROFILING
  253. #define PERF_ENTER(Name) \
  254. StartCAP()
  255. #define PERF_LEAVE(Name) \
  256. StopCAP()
  257. #else
  258. #define PERF_ENTER(Name) \
  259. /* NOTHING */
  260. #define PERF_LEAVE(Name) \
  261. /* NOTHING */
  262. #endif // defined(USE_ICECAP_FOR_DOWNLOAD_PROFILING)
  263. #endif // defined(USE_PERF_DIAG)
  264. #define STOP_SENDREQ_PERF() \
  265. /* nothing */
  266. #define START_SENDREQ_PERF() \
  267. /* nothing */
  268. #endif // defined(_PERFDIAG_)