|
|
1.1 root 1: /*++ BUILD Version: 0001 // Increment this if a change has global effects
2:
3: Copyright (c) 1992-1993 Microsoft Corporation
4:
5: Module Name:
6:
7: counters.c
8:
9: Abstract:
10:
11: This module contains the routines to calculate "DataPoint" values from
12: the registry data.
13:
14: The algoritms were lifted from RussBls's "Data.C" in winmeter.
15:
16: All the math is done in floating point to get the correct results, at
17: the sacrifice of efficiency on a 386 with not 387. We can always
18: revisit these routines later.
19:
20: Revision History:
21:
22: Bob Watson 11/04/92
23: -- modified calculations to use more integer math and "early
24: exits" to improve efficiency on slower & non-coprocessor
25: machines
26: --*/
27:
28: //==========================================================================//
29: // Includes //
30: //==========================================================================//
31:
32:
33: #include "perfmon.h" // perfmon include files
34: #include "counters.h" // Exported declarations for this file
35:
36:
37: //==========================================================================//
38: // Constants //
39: //==========================================================================//
40:
41:
42: #define INVERT PERF_COUNTER_TIMER_INV
43: #define NS100_INVERT PERF_100NSEC_TIMER_INV
44: #define NS100 PERF_100NSEC_TIMER
45: #define TIMER_MULTI PERF_COUNTER_MULTI_TIMER
46: #define TIMER_MULTI_INVERT PERF_COUNTER_MULTI_TIMER_INV
47: #define NS100_MULTI PERF_100NSEC_MULTI_TIMER
48: #define NS100_MULTI_INVERT PERF_100NSEC_MULTI_TIMER_INV
49:
50:
51: #define FRACTION 1
52: #define BULK 1
53:
54:
55: //==========================================================================//
56: // Local Functions //
57: //==========================================================================//
58:
59:
60: #define LargeIntegerLessThanOrEqualZero(X) (\
61: (X).HighPart < 0 ? TRUE : \
62: ((X).HighPart == 0) && ((X).LowPart == 0) ? TRUE : \
63: FALSE)
64:
65:
66: FLOAT
67: eLIntToFloat(
68: IN PLARGE_INTEGER pLargeInt
69: )
70: /*++
71:
72: Routine Description:
73:
74: Converts a large integer to a floating point number
75:
76: Arguments:
77:
78: IN pLargeInt Pointer to large integer to return as a floating point
79: number.
80:
81: Return Value:
82:
83: Floating point representation of Large Integer passed in arg. list
84: --*/
85: {
86: FLOAT eSum;
87:
88: if (pLargeInt->HighPart == 0) {
89: return (FLOAT) pLargeInt->LowPart;
90: } else {
91:
92: // Scale the high portion so it's value is in the upper 32 bit
93: // range. Then add it to the low portion.
94:
95: eSum = (FLOAT) pLargeInt->HighPart * 4.294967296E9f ;
96: eSum += (FLOAT) pLargeInt->LowPart ;
97:
98: return (eSum) ;
99: }
100: } //eLIntToFloat
101:
102: FLOAT
103: eGetTimeInterval(
104: IN PLARGE_INTEGER pliCurrentTime,
105: IN PLARGE_INTEGER pliPreviousTime,
106: IN PLARGE_INTEGER pliFreq
107: )
108: /*++
109:
110: Routine Description:
111:
112: Get the difference between the current and previous time counts,
113: then divide by the frequency.
114:
115: Arguments:
116:
117: IN pCurrentTime
118: IN pPreviousTime
119: used to compute the duration of this sample (the time between
120: samples
121:
122: IN pliFreq
123: # of counts (clock ticks) per second
124:
125: Return Value:
126:
127: Floating point representation of Time Interval (seconds)
128: --*/
129: {
130: FLOAT eTimeDifference;
131: FLOAT eFreq;
132: FLOAT eTimeInterval ;
133:
134: LARGE_INTEGER liDifference;
135:
136: // Get the number of counts that have occured since the last sample
137:
138: liDifference = LargeIntegerSubtract (
139: *pliCurrentTime,
140: *pliPreviousTime);
141:
142: if (LargeIntegerLessThanOrEqualZero(liDifference)) {
143: return (FLOAT) 0.0f;
144: } else {
145: eTimeDifference = eLIntToFloat(&liDifference);
146:
147: // Get the counts per second
148:
149: eFreq = eLIntToFloat(pliFreq) ;
150:
151: // Get the time since the last sample.
152:
153: eTimeInterval = eTimeDifference / eFreq ;
154:
155: return (eTimeInterval) ;
156: }
157: } // eGetTimeInterval
158:
159: FLOAT
160: Counter_Counter_Common(
161: IN PLINESTRUCT pLineStruct,
162: IN INT iType
163: )
164: /*++
165:
166: Routine Description:
167:
168: Take the difference between the current and previous counts
169: then divide by the time interval
170:
171: Arguments:
172:
173: IN pLineStruct
174: Line structure containing data to perform computations on
175:
176: IN iType
177: Counter Type
178:
179:
180: Return Value:
181:
182: Floating point representation of outcome
183: --*/
184: {
185: FLOAT eTimeInterval;
186: FLOAT eDifference;
187: FLOAT eCount ;
188:
189: LARGE_INTEGER liDifference;
190:
191: if (iType != BULK) {
192: liDifference.HighPart = 0;
193: liDifference.LowPart = pLineStruct->lnaCounterValue[0].LowPart -
194: pLineStruct->lnaOldCounterValue[0].LowPart;
195: } else {
196: liDifference = LargeIntegerSubtract (
197: pLineStruct->lnaCounterValue[0],
198: pLineStruct->lnaOldCounterValue[0]);
199: }
200:
201: if (LargeIntegerLessThanOrEqualZero(liDifference)) {
202: return (FLOAT) 0.0f;
203: } else {
204: eTimeInterval = eGetTimeInterval(&pLineStruct->lnNewTime,
205: &pLineStruct->lnOldTime,
206: &pLineStruct->lnPerfFreq) ;
207: if (eTimeInterval <= 0.0f) {
208: return (FLOAT) 0.0f;
209: } else {
210: eDifference = eLIntToFloat (&liDifference);
211:
212: eCount = eDifference / eTimeInterval ;
213:
214: return(eCount) ;
215: }
216: }
217: } // Counter_Counter_Common
218:
219:
220: FLOAT
221: Counter_Average_Timer(
222: IN PLINESTRUCT pLineStruct
223: )
224: /*++
225:
226: Routine Description:
227:
228: Take the differences between the current and previous times and counts
229: divide the time interval by the counts multiply by 10,000,000 (convert
230: from 100 nsec to sec)
231:
232: Arguments:
233:
234: IN pLineStruct
235: Line structure containing data to perform computations on
236:
237: Return Value:
238:
239: Floating point representation of outcome
240: --*/
241: {
242: FLOAT eTimeInterval;
243: FLOAT eCount;
244:
245: LARGE_INTEGER liDifference;
246:
247: // Get the current and previous counts.
248:
249: liDifference.HighPart = 0;
250: liDifference.LowPart = pLineStruct->lnaCounterValue[1].LowPart -
251: pLineStruct->lnaOldCounterValue[1].LowPart;
252:
253: if ( LargeIntegerLessThanOrEqualZero(liDifference)) {
254: return (FLOAT) 0.0f;
255: } else {
256: // Get the amount of time that has passed since the last sample
257: eTimeInterval = eGetTimeInterval(&pLineStruct->lnaCounterValue[0],
258: &pLineStruct->lnaOldCounterValue[0],
259: &pLineStruct->lnPerfFreq) ;
260:
261: if (eTimeInterval < 0.0f) { // return 0 if negative time has passed
262: return (0.0f);
263: } else {
264: // Get the number of counts in this time interval.
265: eCount = eTimeInterval / eLIntToFloat (&liDifference);
266: return(eCount) ;
267: }
268: }
269: } //Counter_Average_Timer
270:
271:
272:
273: FLOAT
274: Counter_Average_Bulk(
275: IN PLINESTRUCT pLineStruct
276: )
277: /*++
278:
279: Routine Description:
280:
281: Take the differences between the current and previous byte counts and
282: operation counts divide the bulk count by the operation counts
283:
284: Arguments:
285:
286: IN pLineStruct
287: Line structure containing data to perform computations on
288:
289: Return Value:
290:
291: Floating point representation of outcome
292: --*/
293: {
294: FLOAT eBulkDelta;
295: FLOAT eDifference;
296: FLOAT eCount;
297:
298: LARGE_INTEGER liDifference;
299: LARGE_INTEGER liBulkDelta;
300:
301: // Get the bulk count increment since the last sample
302:
303: liBulkDelta = LargeIntegerSubtract(
304: pLineStruct->lnaCounterValue[0],
305: pLineStruct->lnaOldCounterValue[0]);
306:
307: if (LargeIntegerLessThanOrEqualZero(liBulkDelta)) {
308: return (FLOAT) 0.0f;
309: } else {
310: // Get the current and previous counts.
311: liDifference.HighPart = 0;
312: liDifference.LowPart = pLineStruct->lnaCounterValue[1].LowPart -
313: pLineStruct->lnaOldCounterValue[1].LowPart;
314:
315: // Get the number of counts in this time interval.
316:
317: if ( LargeIntegerLessThanOrEqualZero(liDifference)) {
318: // Counter value invalid
319: return (FLOAT) 0.0f;
320: } else {
321: eBulkDelta = eLIntToFloat (&liBulkDelta);
322: eDifference = eLIntToFloat (&liDifference);
323: eCount = eBulkDelta / eDifference ;
324:
325: // Scale the value to up to 1 second
326:
327: return(eCount) ;
328: }
329: }
330: } // Counter_Average_Bulk
331:
332:
333:
334: FLOAT
335: Counter_Timer_Common(
336: IN PLINESTRUCT pLineStruct,
337: IN INT iType
338: )
339: /*++
340:
341: Routine Description:
342:
343: Take the difference between the current and previous counts,
344: Normalize the count (counts per interval)
345: divide by the time interval (count = % of interval)
346: if (invert)
347: subtract from 1 (the normalized size of an interval)
348: multiply by 100 (convert to a percentage)
349: this value from 100.
350:
351: Arguments:
352:
353: IN pLineStruct
354: Line structure containing data to perform computations on
355:
356: IN iType
357: Counter Type
358:
359: Return Value:
360:
361: Floating point representation of outcome
362: --*/
363: {
364: FLOAT eTimeInterval;
365: FLOAT eDifference;
366: FLOAT eFreq;
367: FLOAT eFraction;
368: FLOAT eMultiBase;
369: FLOAT eCount ;
370:
371: LARGE_INTEGER liTimeInterval;
372: LARGE_INTEGER liDifference;
373:
374: // Get the amount of time that has passed since the last sample
375:
376: if (iType == NS100 ||
377: iType == NS100_INVERT ||
378: iType == NS100_MULTI ||
379: iType == NS100_MULTI_INVERT) {
380: liTimeInterval = LargeIntegerSubtract (
381: pLineStruct->lnNewTime100Ns,
382: pLineStruct->lnOldTime100Ns) ;
383: eTimeInterval = eLIntToFloat (&liTimeInterval);
384: } else {
385: eTimeInterval = eGetTimeInterval(&pLineStruct->lnNewTime,
386: &pLineStruct->lnOldTime,
387: &pLineStruct->lnPerfFreq) ;
388: }
389:
390: // Get the current and previous counts.
391:
392: liDifference = LargeIntegerSubtract (
393: pLineStruct->lnaCounterValue[0],
394: pLineStruct->lnaOldCounterValue[0]) ;
395:
396: // Get the number of counts in this time interval.
397: // (1, 2, 3 or any number of seconds could have gone by since
398: // the last sample)
399:
400: eDifference = eLIntToFloat (&liDifference) ;
401:
402: if (iType == 0 || iType == INVERT)
403: {
404: // Get the counts per interval (second)
405:
406: eFreq = eLIntToFloat(&pLineStruct->lnPerfFreq) ;
407:
408: // Calculate the fraction of the counts that are used by whatever
409: // we are measuring
410:
411: eFraction = eDifference / eFreq ;
412: }
413: else
414: {
415: eFraction = eDifference ;
416: }
417:
418: // Calculate the fraction of time used by what were measuring.
419:
420: eCount = eFraction / eTimeInterval ;
421:
422: // If this is an inverted count take care of the inversion.
423:
424: if (iType == INVERT || iType == NS100_INVERT)
425: eCount = (FLOAT) 1.0 - eCount ;
426:
427: // If this is an inverted multi count take care of the inversion.
428:
429: if (iType == TIMER_MULTI_INVERT || iType == NS100_MULTI_INVERT) {
430: eMultiBase = (FLOAT)pLineStruct->lnaCounterValue[1].LowPart ;
431: eCount = (FLOAT) eMultiBase - eCount ;
432: }
433:
434: // Scale the value to up to 100.
435:
436: eCount *= 100.0f ;
437:
438: if (eCount < 0.0f) eCount = 0.0f ;
439:
440: if (eCount > 100.0f &&
441: iType != NS100_MULTI &&
442: iType != NS100_MULTI_INVERT &&
443: iType != TIMER_MULTI &&
444: iType != TIMER_MULTI_INVERT) {
445:
446: eCount = 100.0f;
447: }
448:
449: return(eCount) ;
450: } // Counter_Timer_Common
451:
452:
453: FLOAT
454: Counter_Raw_Fraction(
455: IN PLINESTRUCT pLineStruct
456: )
457: /*++
458:
459: Routine Description:
460:
461: Evaluate a raw fraction (no time, just two values: Numerator and
462: Denominator) and multiply by 100 (to make a percentage;
463:
464: Arguments:
465:
466: IN pLineStruct
467: Line structure containing data to perform computations on
468:
469: Return Value:
470:
471: Floating point representation of outcome
472: --*/
473: {
474: FLOAT eCount ;
475:
476: LARGE_INTEGER liNumerator;
477:
478: if ( pLineStruct->lnaCounterValue[0].LowPart == 0 ||
479: pLineStruct->lnaCounterValue[1].LowPart == 0 ) {
480: // invalid value
481: return (0.0f);
482: } else {
483: liNumerator = EnlargedIntegerMultiply (
484: pLineStruct->lnaCounterValue[0].LowPart,
485: 100L);
486: eCount = eLIntToFloat(&liNumerator) /
487: (FLOAT) pLineStruct->lnaCounterValue[1].LowPart;
488: return(eCount) ;
489: }
490: } // Counter_Raw_Fraction
491:
492:
493: FLOAT
494: eElapsedTime(
495: PLINESTRUCT pLineStruct,
496: INT iType
497: )
498: /*++
499:
500: Routine Description:
501:
502: Converts 100NS elapsed time to fractional seconds
503:
504: Arguments:
505:
506: IN pLineStruct
507: Line structure containing data to perform computations on
508:
509: IN iType
510: Unused.
511:
512: Return Value:
513:
514: Floating point representation of elapsed time in seconds
515: --*/
516: {
517: FLOAT eSeconds ;
518:
519: LARGE_INTEGER liDifference;
520:
521: if (LargeIntegerLessThanOrEqualZero(pLineStruct->lnaCounterValue[0] )) {
522: // no data [start time = 0] so return 0
523: return (FLOAT) 0.0f;
524: } else {
525: // otherwise compute difference between current time and start time
526: liDifference = LargeIntegerSubtract (
527: pLineStruct->lnNewTime, // sample time in obj. units
528: pLineStruct->lnaCounterValue[0]); // start time in obj. units
529:
530: if (LargeIntegerLessThanOrEqualZero(liDifference)) {
531: return (FLOAT) 0.0f;
532: } else {
533: // convert to fractional seconds using object counter
534: eSeconds = eLIntToFloat (&liDifference) /
535: eLIntToFloat (&pLineStruct->lnObject.PerfFreq);
536:
537: return (eSeconds);
538: }
539: }
540:
541: } // eElapsedTime
542:
543:
544: FLOAT
545: Sample_Common(
546: PLINESTRUCT pLineStruct,
547: INT iType
548: )
549: /*++
550:
551: Routine Description:
552:
553: Divites "Top" differenced by Base Difference
554:
555: Arguments:
556:
557: IN pLineStruct
558: Line structure containing data to perform computations on
559:
560: IN iType
561: Counter Type
562:
563: Return Value:
564:
565: Floating point representation of outcome
566: --*/
567: {
568: FLOAT eCount ;
569:
570: LONG lDifference;
571: LONG lBaseDifference;
572:
573: lDifference = pLineStruct->lnaCounterValue[0].LowPart -
574: pLineStruct->lnaOldCounterValue[0].LowPart ;
575:
576: if (lDifference <= 0) {
577: return (FLOAT) 0.0f;
578: } else {
579: lBaseDifference = pLineStruct->lnaCounterValue[1].LowPart -
580: pLineStruct->lnaOldCounterValue[1].LowPart ;
581:
582: if ( lBaseDifference <= 0 ) {
583: // invalid value
584: return (0.0f);
585: } else {
586: eCount = (FLOAT)lDifference / (FLOAT)lBaseDifference ;
587:
588: if (iType == FRACTION) {
589: eCount *= (FLOAT) 100.0f ;
590: }
591: return(eCount) ;
592: }
593: }
594: } // Sample_Common
595:
596:
597: //==========================================================================//
598: // Exported Functions //
599: //==========================================================================//
600:
601:
602: /*****************************************************************************
603: * Counter_Counter - Take the difference between the current and previous
604: * counts then divide by the time interval
605: ****************************************************************************/
606: #define Counter_Counter(pLineStruct) \
607: Counter_Counter_Common(pLineStruct, 0)
608: #if 0
609: FLOAT Counter_Counter(PLINESTRUCT pLineStruct)
610: {
611: return Counter_Counter_Common(pLineStruct, 0) ;
612: }
613: #endif
614:
615: /*****************************************************************************
616: * Counter_Bulk - Take the difference between the current and previous
617: * counts then divide by the time interval
618: * Same as a Counter_counter except it uses large_ints
619: ****************************************************************************/
620: #define Counter_Bulk(pLineStruct) \
621: Counter_Counter_Common(pLineStruct, BULK)
622: #if 0
623: FLOAT Counter_Bulk(PLINESTRUCT pLineStruct)
624: {
625: return Counter_Counter_Common(pLineStruct, BULK) ;
626: }
627: #endif
628:
629:
630: /*****************************************************************************
631: * Counter_Timer100Ns -
632: *
633: ****************************************************************************/
634: #define Counter_Timer100Ns(pLineStruct) \
635: Counter_Timer_Common(pLineStruct, NS100)
636: #if 0
637: FLOAT Counter_Timer100Ns(PLINESTRUCT pLineStruct)
638: {
639: return Counter_Timer_Common(pLineStruct, NS100) ;
640: }
641: #endif
642:
643: /*****************************************************************************
644: * Counter_Timer100Ns_Inv -
645: *
646: ****************************************************************************/
647: #define Counter_Timer100Ns_Inv(pLineStruct) \
648: Counter_Timer_Common(pLineStruct, NS100_INVERT)
649: #if 0
650: FLOAT Counter_Timer100Ns_Inv(PLINESTRUCT pLineStruct)
651: {
652: return Counter_Timer_Common(pLineStruct, NS100_INVERT) ;
653:
654: }
655: #endif
656:
657: /*****************************************************************************
658: * Counter_Timer_Multi -
659: *
660: ****************************************************************************/
661: #define Counter_Timer_Multi(pLineStruct) \
662: Counter_Timer_Common(pLineStruct, TIMER_MULTI)
663: #if 0
664: FLOAT Counter_Timer_Multi(PLINESTRUCT pLineStruct)
665: {
666: return Counter_Timer_Common(pLineStruct, TIMER_MULTI) ;
667: }
668: #endif
669:
670: /*****************************************************************************
671: * Counter_Timer_Multi_Inv -
672: *
673: ****************************************************************************/
674: #define Counter_Timer_Multi_Inv(pLineStruct) \
675: Counter_Timer_Common(pLineStruct, TIMER_MULTI_INVERT)
676: #if 0
677: FLOAT Counter_Timer_Multi_Inv(PLINESTRUCT pLineStruct)
678: {
679: return Counter_Timer_Common(pLineStruct, TIMER_MULTI_INVERT) ;
680: }
681: #endif
682:
683:
684: /*****************************************************************************
685: * Counter_Timer100Ns_Multi -
686: *
687: ****************************************************************************/
688: #define Counter_Timer100Ns_Multi(pLineStruct) \
689: Counter_Timer_Common(pLineStruct, NS100_MULTI)
690: #if 0
691: FLOAT Counter_Timer100Ns_Multi(PLINESTRUCT pLineStruct)
692: {
693: return Counter_Timer_Common(pLineStruct, NS100_MULTI) ;
694: }
695: #endif
696:
697: /*****************************************************************************
698: * Counter_Timer100Ns_Multi_Inv -
699: *
700: ****************************************************************************/
701: #define Counter_Timer100Ns_Multi_Inv(pLineStruct) \
702: Counter_Timer_Common(pLineStruct, NS100_MULTI_INVERT)
703: #if 0
704: FLOAT Counter_Timer100Ns_Multi_Inv(PLINESTRUCT pLineStruct)
705: {
706: return Counter_Timer_Common(pLineStruct, NS100_MULTI_INVERT) ;
707: }
708: #endif
709:
710: /*****************************************************************************
711: * Counter_Timer - Take the difference between the current and previous
712: * counts,
713: * Normalize the count (counts per interval)
714: * divide by the time interval (count = % of interval)
715: * multiply by 100 (convert to a percentage)
716: * this value from 100.
717: ****************************************************************************/
718: #define Counter_Timer(pLineStruct) \
719: Counter_Timer_Common(pLineStruct, 0)
720: #if 0
721: FLOAT Counter_Timer(PLINESTRUCT pLineStruct)
722: {
723: return Counter_Timer_Common(pLineStruct, 0) ;
724: }
725: #endif
726:
727:
728: /*****************************************************************************
729: * Counter_Timer_Inv - Take the difference between the current and previous
730: * counts,
731: * Normalize the count (counts per interval)
732: * divide by the time interval (count = % of interval)
733: * subtract from 1 (the normalized size of an interval)
734: * multiply by 100 (convert to a percentage)
735: * this value from 100.
736: ****************************************************************************/
737: #define Counter_Timer_Inv(pLineStruct) \
738: Counter_Timer_Common(pLineStruct, INVERT)
739: #if 0
740: FLOAT Counter_Timer_Inv(PLINESTRUCT pLineStruct)
741: {
742: return Counter_Timer_Common(pLineStruct, INVERT) ;
743: }
744: #endif
745:
746: /*****************************************************************************
747: * Sample_Counter -
748: ****************************************************************************/
749: #define Sample_Counter(pLineStruct) \
750: Sample_Common(pLineStruct, 0)
751: #if 0
752: FLOAT Sample_Counter(PLINESTRUCT pLineStruct)
753: {
754: return Sample_Common(pLineStruct, 0) ;
755: }
756: #endif
757:
758: /*****************************************************************************
759: * Sample_Fraction -
760: ****************************************************************************/
761: #define Sample_Fraction(pLineStruct) \
762: Sample_Common(pLineStruct, FRACTION)
763: #if 0
764: FLOAT Sample_Fraction(PLINESTRUCT pLineStruct)
765: {
766: return Sample_Common(pLineStruct, FRACTION) ;
767: }
768: #endif
769:
770: /*****************************************************************************
771: * Counter_Rawcount - This is just a raw count.
772: ****************************************************************************/
773: #define Counter_Rawcount(pLineStruct) \
774: ((FLOAT) (pLineStruct->lnaCounterValue[0].LowPart))
775: #if 0
776: FLOAT Counter_Rawcount(PLINESTRUCT pLineStruct)
777: {
778: return((FLOAT) (pLineStruct->lnaCounterValue[0].LowPart)) ;
779: }
780: #endif
781:
782: /*****************************************************************************
783: * Counter_Null - The counters that return nothing go here.
784: ****************************************************************************/
785: #define Counter_Elapsed_Time(pLineStruct) \
786: eElapsedTime (pLineStruct, 0)
787: #if 0
788: FLOAT Counter_Elapsed_Time (PLINESTRUCT pLineStruct)
789: {
790: return eElapsedTime (pLineStruct, 0);
791: }
792: #endif
793:
794: /*****************************************************************************
795: * Counter_Null - The counters that return nothing go here.
796: ****************************************************************************/
797: #define Counter_Null(pline) \
798: ((FLOAT) 0.0)
799: #if 0
800: FLOAT Counter_Null(PLINESTRUCT pline)
801: {
802: return((FLOAT) 0.0);
803: pline;
804: }
805: #endif
806:
807:
808: FLOAT
809: CounterEntry (
810: PLINESTRUCT pLine
811: )
812: {
813: switch (pLine->lnCounterType) {
814: case PERF_COUNTER_COUNTER:
815: return Counter_Counter (pLine);
816:
817: case PERF_COUNTER_TIMER:
818: return Counter_Timer (pLine);
819:
820: case PERF_COUNTER_QUEUELEN_TYPE:
821: return Counter_Queuelen(pLine);
822:
823: case PERF_COUNTER_BULK_COUNT:
824: return Counter_Bulk (pLine);
825:
826: case PERF_COUNTER_TEXT:
827: return Counter_Null (pLine);
828:
829: case PERF_COUNTER_RAWCOUNT:
830: return Counter_Rawcount(pLine);
831:
832: case PERF_SAMPLE_FRACTION:
833: return Sample_Fraction(pLine);
834:
835: case PERF_SAMPLE_COUNTER:
836: return Sample_Counter (pLine);
837:
838: case PERF_COUNTER_NODATA:
839: return Counter_Null (pLine);
840:
841: case PERF_COUNTER_TIMER_INV:
842: return Counter_Timer_Inv (pLine);
843:
844: case PERF_RAW_BASE:
845: return Counter_Null (pLine);
846:
847: case PERF_AVERAGE_TIMER:
848: return Counter_Average_Timer (pLine);
849:
850: case PERF_AVERAGE_BULK:
851: return Counter_Average_Bulk (pLine);
852:
853: case PERF_100NSEC_TIMER:
854: return Counter_Timer100Ns (pLine);
855:
856: case PERF_100NSEC_TIMER_INV:
857: return Counter_Timer100Ns_Inv (pLine);
858:
859: case PERF_COUNTER_MULTI_TIMER:
860: return Counter_Timer_Multi (pLine);
861:
862: case PERF_COUNTER_MULTI_TIMER_INV:
863: return Counter_Timer_Multi_Inv (pLine);
864:
865: case PERF_COUNTER_MULTI_BASE:
866: return Counter_Null (pLine);
867:
868: case PERF_100NSEC_MULTI_TIMER:
869: return Counter_Timer100Ns_Multi (pLine);
870:
871: case PERF_100NSEC_MULTI_TIMER_INV:
872: return Counter_Timer100Ns_Multi_Inv (pLine);
873:
874: case PERF_RAW_FRACTION:
875: return Counter_Raw_Fraction (pLine);
876:
877: case PERF_ELAPSED_TIME:
878: return Counter_Elapsed_Time (pLine);
879:
880: default:
881: return Counter_Null (pLine);
882:
883: }
884: }
885:
886:
887: BOOL
888: IsCounterSupported (
889: DWORD dwCounterType
890: )
891: {
892: switch (dwCounterType) {
893: // supported counters
894: case PERF_COUNTER_COUNTER:
895: case PERF_COUNTER_TIMER:
896: case PERF_COUNTER_QUEUELEN_TYPE:
897: case PERF_COUNTER_BULK_COUNT:
898: case PERF_COUNTER_RAWCOUNT:
899: case PERF_SAMPLE_FRACTION:
900: case PERF_SAMPLE_COUNTER:
901: case PERF_COUNTER_TIMER_INV:
902: case PERF_AVERAGE_TIMER:
903: case PERF_AVERAGE_BULK:
904: case PERF_100NSEC_TIMER:
905: case PERF_100NSEC_TIMER_INV:
906: case PERF_COUNTER_MULTI_TIMER:
907: case PERF_COUNTER_MULTI_TIMER_INV:
908: case PERF_100NSEC_MULTI_TIMER:
909: case PERF_100NSEC_MULTI_TIMER_INV:
910: case PERF_RAW_FRACTION:
911: case PERF_ELAPSED_TIME:
912: return TRUE;
913:
914: // unsupported counters
915: case PERF_COUNTER_TEXT:
916: case PERF_COUNTER_NODATA:
917: case PERF_RAW_BASE:
918: case PERF_COUNTER_MULTI_BASE:
919: default:
920: return FALSE;
921:
922: }
923: }
924:
925:
926:
927:
928:
929:
930:
931:
932:
933:
934:
935:
936:
937:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.