Annotation of mstools/samples/sdktools/perfmon/counters.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.