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;
}