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.

317 lines
8.2 KiB

  1. //
  2. // Systrack - System resource tracking
  3. // Copyright (c) Microsoft Corporation, 1997
  4. //
  5. //
  6. // module: pooltag.cxx
  7. // author: silviuc
  8. // created: Wed Nov 11 13:45:37 1998
  9. //
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <stdarg.h>
  13. #include <time.h>
  14. extern "C" {
  15. #include <nt.h>
  16. #include <ntrtl.h>
  17. #include <nturtl.h>
  18. }
  19. #include <windows.h>
  20. #include "assert.hxx"
  21. #include "history.hxx"
  22. #include "table.hxx"
  23. #include "systrack.hxx"
  24. #include "pooltag.hxx"
  25. //////////////////////////////////////////////////////////////////////
  26. //////////////////////////////////////////////////////////////////////
  27. //////////////////////////////////////////////////////////////////////
  28. #define TRACK_POOLTAG_TABLE_SIZE 16384
  29. #define TRACK_POOLTAG_HISTORY_SIZE 60
  30. //////////////////////////////////////////////////////////////////////
  31. //////////////////////////////////////////////////////////////////////
  32. //////////////////////////////////////////////////////////////////////
  33. class TRACK_POOLTAG_INFORMATION
  34. {
  35. public:
  36. union {
  37. UCHAR Tag[4];
  38. ULONG Key;
  39. };
  40. SIZE_T LastNonPagedUsed;
  41. SIZE_T LastPagedUsed;
  42. History<SIZE_T, TRACK_POOLTAG_HISTORY_SIZE> PagedUsed;
  43. History<SIZE_T, TRACK_POOLTAG_HISTORY_SIZE> NonPagedUsed;
  44. public:
  45. bool VerifyNonPagedUsed (SIZE_T DeltaValue) {
  46. return NonPagedUsed.Delta (DeltaValue);
  47. }
  48. bool VerifyPagedUsed (SIZE_T DeltaValue) {
  49. return PagedUsed.Delta (DeltaValue);
  50. }
  51. void Print () {
  52. static unsigned Calls = 0;
  53. UCHAR * TagChar;
  54. ULONG FirstIndex, LastIndex;
  55. TagChar = (UCHAR *)(& Key);
  56. if (Calls % 25 == 0)
  57. {
  58. printf (" - - - - - - - - - - - - - - - - - - - -");
  59. printf (" - - - - - - - - - - - - - - - - - - - - \n");
  60. printf ("%-4s %-16s %-16s \n", "Tag", "NP pool", "P pool");
  61. printf (" - - - - - - - - - - - - - - - - - - - -");
  62. printf (" - - - - - - - - - - - - - - - - - - - - \n");
  63. fflush( stdout );
  64. }
  65. Calls++;
  66. printf ("%c%c%c%c ",
  67. TagChar[0],
  68. TagChar[1],
  69. TagChar[2],
  70. TagChar[3]);
  71. printf ("%-8u %-8u %-8u %-8u\n",
  72. NonPagedUsed.Last(),
  73. NonPagedUsed.First(),
  74. PagedUsed.Last(),
  75. PagedUsed.First());
  76. fflush( stdout );
  77. DebugMessage ("systrack: pool: %c%c%c%c: NP: %u +%d, P: %u +%d\n",
  78. TagChar[0],
  79. TagChar[1],
  80. TagChar[2],
  81. TagChar[3],
  82. NonPagedUsed.Last(),
  83. NonPagedUsed.Last() - NonPagedUsed.First(),
  84. PagedUsed.Last(),
  85. PagedUsed.Last() - PagedUsed.First());
  86. }
  87. };
  88. typedef TRACK_POOLTAG_INFORMATION* PTRACK_POOLTAG_INFORMATION;
  89. //////////////////////////////////////////////////////////////////////
  90. //////////////////////////////////////////////////////////////////////
  91. //////////////////////////////////////////////////////////////////////
  92. Table<TRACK_POOLTAG_INFORMATION, TRACK_POOLTAG_TABLE_SIZE> PoolTable;
  93. //////////////////////////////////////////////////////////////////////
  94. /////////////////////////////////////////////////////// Pool tag table
  95. //////////////////////////////////////////////////////////////////////
  96. //////////////////////////////////////////////////////////////////////
  97. //////////////////////////////////////////////////////////////////////
  98. //////////////////////////////////////////////////////////////////////
  99. void
  100. SystemPoolTrack (
  101. ULONG Period,
  102. ULONG Delta)
  103. {
  104. NTSTATUS Status;
  105. ULONG RealLength;
  106. PSYSTEM_POOLTAG_INFORMATION Info;
  107. BOOL PagedDelta, NonPagedDelta;
  108. for ( ; ; )
  109. {
  110. //
  111. // SystemPoolTagInformation
  112. //
  113. Info = (PSYSTEM_POOLTAG_INFORMATION)QuerySystemPoolTagInformation();
  114. if (Info == NULL) {
  115. printf ("Probably pool tags are not enabled on this machine.\n");
  116. exit (1);
  117. }
  118. //
  119. // Loop over the tags and see if something changed.
  120. //
  121. {
  122. ULONG Index;
  123. for (Index = 0; Index < Info->Count; Index++) {
  124. PTRACK_POOLTAG_INFORMATION Tag;
  125. Tag = PoolTable.Add (Info->TagInfo[Index].TagUlong);
  126. if (Tag == NULL)
  127. printf ("Cannot add pool table entry \n");
  128. Tag->PagedUsed.Add (Info->TagInfo[Index].PagedUsed);
  129. Tag->NonPagedUsed.Add (Info->TagInfo[Index].NonPagedUsed);
  130. NonPagedDelta = FALSE;
  131. if (Tag->VerifyNonPagedUsed (Delta)) {
  132. NonPagedDelta = TRUE;
  133. }
  134. PagedDelta = FALSE;
  135. if (Tag->VerifyPagedUsed (Delta)) {
  136. PagedDelta = TRUE;
  137. }
  138. if( NonPagedDelta || PagedDelta ) {
  139. Tag->Print();
  140. if( NonPagedDelta ) {
  141. Tag->NonPagedUsed.Reset (Info->TagInfo[Index].NonPagedUsed);
  142. }
  143. if( PagedDelta ) {
  144. Tag->PagedUsed.Reset (Info->TagInfo[Index].PagedUsed);
  145. }
  146. }
  147. }
  148. }
  149. //
  150. // Sleep a little bit.
  151. //
  152. Sleep (Period);
  153. }
  154. }
  155. bool MatchTag (
  156. UCHAR * Pattern,
  157. UCHAR * Tag)
  158. {
  159. unsigned Index;
  160. for (Index = 0; Index < 4; Index++)
  161. {
  162. if (Pattern[Index] == '*')
  163. return true;
  164. else if (Pattern[Index] == '?')
  165. continue;
  166. else if (Tag[Index] == Pattern[Index])
  167. continue;
  168. else
  169. return false;
  170. }
  171. return true;
  172. }
  173. void
  174. SystemPoolTagTrack (
  175. ULONG Period,
  176. UCHAR * PatternTag,
  177. ULONG Delta)
  178. {
  179. NTSTATUS Status;
  180. ULONG RealLength;
  181. PSYSTEM_POOLTAG_INFORMATION Info;
  182. BOOL NonPagedUsedDelta, PagedUsedDelta;
  183. for ( ; ; )
  184. {
  185. //
  186. // SystemPoolTagInformation
  187. //
  188. Info = (PSYSTEM_POOLTAG_INFORMATION)QuerySystemPoolTagInformation();
  189. if (Info == NULL) {
  190. printf ("Probably pool tags are not enabled on this machine.\n");
  191. exit (1);
  192. }
  193. //
  194. // Loop over the tags and see if something changed.
  195. //
  196. {
  197. ULONG Index;
  198. for (Index = 0; Index < Info->Count; Index++) {
  199. PTRACK_POOLTAG_INFORMATION Tag;
  200. if (! MatchTag (PatternTag, (UCHAR *)(& (Info->TagInfo[Index].TagUlong))))
  201. continue;
  202. Tag = PoolTable.Add (Info->TagInfo[Index].TagUlong);
  203. if (Tag == NULL)
  204. printf ("Cannot add pool table entry \n");
  205. Tag->PagedUsed.Add (Info->TagInfo[Index].PagedUsed);
  206. Tag->NonPagedUsed.Add (Info->TagInfo[Index].NonPagedUsed);
  207. NonPagedUsedDelta = FALSE;
  208. if (Tag->VerifyNonPagedUsed (Delta)) {
  209. NonPagedUsedDelta = TRUE;
  210. }
  211. PagedUsedDelta = FALSE;
  212. if (Tag->VerifyPagedUsed (Delta)) {
  213. PagedUsedDelta = TRUE;
  214. }
  215. if( NonPagedUsedDelta || PagedUsedDelta ) {
  216. Tag->Print();
  217. if( NonPagedUsedDelta ) {
  218. Tag->NonPagedUsed.Reset (Info->TagInfo[Index].NonPagedUsed);
  219. }
  220. if( PagedUsedDelta ) {
  221. Tag->PagedUsed.Reset (Info->TagInfo[Index].PagedUsed);
  222. }
  223. }
  224. }
  225. }
  226. //
  227. // Sleep a little bit.
  228. //
  229. Sleep (Period);
  230. }
  231. }
  232. //
  233. // end of module: pooltag.cxx
  234. //