DosPerfSysCall - Example Code

This example uses DosPerfSysCall to obtain CPU Utilization information on a uniprocessor.

#define INCL_BASE

#include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <perfutil.h>

/*
   Convert 8-byte (low, high) time value to double
*/
#define LL2F(high, low) (4294967296.0*(high)+(low))


/* This is a 1 processor example */

void main (int argc, char *argv[])
{
    APIRET      rc;
    int         i, iter, sleep_sec;
    double      ts_val, ts_val_prev;
    double      idle_val, idle_val_prev;
    double      busy_val, busy_val_prev;
    double      intr_val, intr_val_prev;
    CPUUTIL     CPUUtil;

    if ((argc < 2) || (*argv[1] < '1') || (*argv[1] > '9')) {
        fprintf(stderr, "usage: %s [1-9]\n", argv[0]);
        exit(0);
    }
    sleep_sec = *argv[1] - '0';

    iter = 0;
    do {
        rc = DosPerfSysCall(CMD_KI_RDCNT,(ULONG) &CPUUtil,0,0);
        if (rc) {
            fprintf(stderr, "CMD_KI_RDCNT failed rc = %d\n",rc);
            exit(1);
        }
        ts_val = LL2F(CPUUtil.ulTimeHigh, CPUUtil.ulTimeLow);
        idle_val = LL2F(CPUUtil.ulIdleHigh, CPUUtil.ulIdleLow);
        busy_val = LL2F(CPUUtil.ulBusyHigh, CPUUtil.ulBusyLow);
        intr_val = LL2F(CPUUtil.ulIntrHigh, CPUUtil.ulIntrLow);

        if (iter > 0) {
            double  ts_delta = ts_val - ts_val_prev;
            printf("idle: %4.2f%%  busy: %4.2f%%  intr: %4.2f%%\n",
                   (idle_val - idle_val_prev)/ts_delta*100.0,
                   (busy_val - busy_val_prev)/ts_delta*100.0,
                   (intr_val - intr_val_prev)/ts_delta*100.0);
        }

        ts_val_prev = ts_val;
        idle_val_prev = idle_val;
        busy_val_prev = busy_val;
        intr_val_prev = intr_val;

        iter++;
        DosSleep(1000*sleep_sec);

    } while (1);
}

This example performs software tracing from a program in ring 3.

#define INCL_BASE

#include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <perfutil.h>

int main ( int argc, char *argv[] )
{
    APIRET    rc;
    BYTE      HookBuffer[256];
    HOOKDATA  HookData = {0,HookBuffer};
    ULONG     ulMajor, ulMinor;

    /* Log 3 ULONG values (1, 2, and 3) and a string.   */

    *((PULONG)&HookBuffer[0]) = 1;
    *((PULONG)&HookBuffer[4]) = 2;
    *((PULONG)&HookBuffer[8]) = 3;
    strcpy((PSZ)&HookBuffer[12], "Test of 3 ULONG values and a string.")
    HookData.ulLength = 12 + strlen((PSZ)&HookBuffer[12]) + 1;

    ulMajor = 0x00b8;        /* Hook major code  */
    ulMinor = 0x0001;        /* Hook minor code  */

    rc = DosPerfSysCall( CMD_SOFTTRACE_LOG,
                         ulMajor, ulMinor,
                         (ULONG) &HookData);
    if (rc != NO_ERROR) {
       fprintf(stderr, "CMD_SOFTTRACE_LOG failed:  rc = %u\n", rc);
       return 1;
       }

    return NO_ERROR;
}


[Back: DosPerfSysCall - Related Functions]
[Next: DosPerfSysCall - Topics]