#include <X11/Xos.h>
#include <X11/Intrinsic.h>
#include <X11/Xlocale.h>
#include <stdio.h>
#include <stdlib.h>
#include "xload.h"
#if !defined(DGUX)
#if defined(att) || defined(QNX4)
#define LOADSTUB
#endif
#ifndef macII
#ifndef apollo
#ifndef LOADSTUB
#if !defined(linux) && !defined(__UNIXOS2__) && !defined(__GLIBC__)
#include <nlist.h>
#endif
#endif
#endif
#endif
#if defined(MOTOROLA) && defined(SYSV)
#include <sys/sysinfo.h>
#endif
#ifdef sun
# include <sys/param.h>
# if defined(SVR4) && (OSMAJORVERSION == 5) && (OSMINORVERSION > 3)
# include <kvm.h>
# endif
# if defined(i386) && !defined(SVR4)
# include <kvm.h>
# define KVM_ROUTINES
# endif
#endif
#ifdef CSRG_BASED
#include <sys/param.h>
#endif
#if defined(umips) || (defined(ultrix) && defined(mips))
#include <sys/fixpoint.h>
#endif
#if defined(CRAY) || defined(AIXV3)
#include <sys/param.h>
#define word word_t
#include <sys/sysinfo.h>
#undef word
#undef n_type
#define n_type n_value
#endif
#ifdef sequent
#include <sys/vm.h>
#endif
#ifdef macII
#include <a.out.h>
#include <sys/var.h>
#define X_AVENRUN 0
#define fxtod(i) (vec[i].high+(vec[i].low/65536.0))
struct lavnum {
unsigned short high;
unsigned short low;
};
#endif
#ifdef hcx
#include <sys/param.h>
#endif
#if defined(UTEK) || defined(alliant) || (defined(MOTOROLA) && defined(SVR4))
#define FSCALE 100.0
#endif
#ifdef sequent
#define FSCALE 1000.0
#endif
#ifdef sgi
#define FSCALE 1024.0
#endif
#if defined(sony) && OSMAJORVERSION == 4
#ifdef mips
#include <sys/fixpoint.h>
#else
#include <sys/param.h>
#endif
#endif
#ifdef __osf__
#ifndef WHICH_AVG
#define WHICH_AVG 1
#endif
#include <sys/table.h>
#endif
#ifdef SVR4
#ifndef FSCALE
#define FSCALE (1 << 8)
#endif
#endif
#ifdef X_NOT_POSIX
extern long lseek();
#endif
void xload_error(char *, char *);
#ifdef apollo
#include <apollo/base.h>
#include <apollo/time.h>
typedef struct {
short state;
pinteger usr;
linteger upc;
linteger usp;
linteger usb;
time_$clock_t cpu_total;
unsigned short priority;
} proc1_$info_t;
void proc1_$get_cput(
time_$clock_t *cput
);
void proc1_$get_info(
short &pid,
proc1_$info_t *info,
status_$t *sts
);
static int lastNullCpu;
static int lastClock;
void InitLoadPoint()
{
time_$clock_t timeNow;
proc1_$info_t info;
status_$t st;
proc1_$get_info( (short) 2, &info, &st );
time_$clock( &timeNow );
lastClock = timeNow.low32;
lastNullCpu = info.cpu_total.low32;
}
void GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
time_$clock_t timeNow;
double temp;
proc1_$info_t info;
status_$t st;
proc1_$get_info( (short) 2, &info, &st );
time_$clock( &timeNow );
temp = info.cpu_total.low32 - lastNullCpu;
*(double *)call_data = 1.0 - temp / (timeNow.low32 - lastClock);
lastClock = timeNow.low32;
lastNullCpu = info.cpu_total.low32;
}
#else
#if defined(SYSV) && defined(i386)
#include <sys/param.h>
#include <sys/buf.h>
#include <sys/immu.h>
#include <sys/region.h>
#include <sys/var.h>
#include <sys/proc.h>
#define KERNEL_FILE "/unix"
#define KMEM_FILE "/dev/kmem"
#define VAR_NAME "v"
#define PROC_NAME "proc"
#define BUF_NAME "buf"
#define DECAY 0.8
struct nlist namelist[] = {
{VAR_NAME},
{PROC_NAME},
{BUF_NAME},
{0},
};
static int kmem;
static struct var v;
static struct proc *p;
static XtPointer first_buf, last_buf;
void InitLoadPoint()
{
int i;
nlist( KERNEL_FILE, namelist);
for (i=0; namelist[i].n_name; i++)
if (namelist[i].n_value == 0)
xload_error("cannot get name list from", KERNEL_FILE);
if ((kmem = open(KMEM_FILE, O_RDONLY)) < 0)
xload_error("cannot open", KMEM_FILE);
if (lseek(kmem, namelist[0].n_value, 0) == -1)
xload_error("cannot seek", VAR_NAME);
if (read(kmem, &v, sizeof(v)) != sizeof(v))
xload_error("cannot read", VAR_NAME);
if ((p=(struct proc *)malloc(v.v_proc*sizeof(*p))) == NULL)
xload_error("cannot allocat space for", PROC_NAME);
first_buf = (XtPointer) namelist[2].n_value;
last_buf = (char *)first_buf + v.v_buf * sizeof(struct buf);
}
void GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
double *loadavg = (double *)call_data;
static double avenrun = 0.0;
int i, nproc, size;
(void) lseek(kmem, namelist[0].n_value, 0);
(void) read(kmem, &v, sizeof(v));
size = (struct proc *)v.ve_proc - (struct proc *)namelist[1].n_value;
(void) lseek(kmem, namelist[1].n_value, 0);
(void) read(kmem, p, size * sizeof(struct proc));
for (nproc = 0, i=0; i<size; i++)
if ((p[i].p_stat == SRUN) ||
(p[i].p_stat == SIDL) ||
(p[i].p_stat == SXBRK) ||
(p[i].p_stat == SSLEEP && (p[i].p_pri < PZERO) &&
(p[i].p_wchan >= (char *)first_buf) && (p[i].p_wchan < (char *)last_buf)))
nproc++;
avenrun = DECAY * avenrun + nproc * (1.0 - DECAY);
*loadavg = avenrun;
return;
}
#else
#ifdef KVM_ROUTINES
static struct nlist nl[2];
static kvm_t *kd;
void
InitLoadPoint()
{
kd = kvm_open("/vmunix", NULL, NULL, O_RDONLY, "Load Widget");
if (kd == (kvm_t *)0) {
xload_error("cannot get access to kernel address space", "");
}
nl[0].n_name = "avenrun";
nl[1].n_name = NULL;
if (kvm_nlist(kd, nl) != 0) {
xload_error("cannot get name list", "");
}
if (nl[0].n_value == 0) {
xload_error("Cannot find address for avenrun in the kernel\n", "");
}
}
void
GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
double *loadavg = (double *)call_data;
long temp;
if (kvm_read(kd, nl[0].n_value, (char *)&temp, sizeof (temp)) !=
sizeof (temp)) {
xload_error("Kernel read error", "");
}
*loadavg = (double)temp/FSCALE;
}
#else
#ifdef linux
void InitLoadPoint()
{
return;
}
void GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
static int fd = -1;
int n;
char buf[10] = {0, };
#ifndef X_LOCALE
char *dp;
static char ldp = 0;
#endif
if (fd < 0)
{
if (fd == -2 ||
(fd = open("/proc/loadavg", O_RDONLY)) < 0)
{
fd = -2;
*(double *)call_data = 0.0;
return;
}
#ifndef X_LOCALE
ldp = *localeconv()->decimal_point;
#endif
}
else
lseek(fd, 0, 0);
if ((n = read(fd, buf, sizeof(buf)-1)) > 0) {
#ifndef X_LOCALE
if (ldp != '.')
while ((dp = memchr(buf,'.',sizeof(buf)-1)) != NULL) {
*(char *)dp = ldp;
}
#endif
if (sscanf(buf, "%lf", (double *)call_data) == 1)
return;
}
*(double *)call_data = 0.0;
return;
}
#else
#ifdef __GNU__
#include <mach.h>
static processor_set_t default_set;
void InitLoadPoint()
{
if (processor_set_default (mach_host_self (), &default_set) != KERN_SUCCESS)
xload_error("cannot get processor_set_default", "");
}
void GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
host_t host;
struct processor_set_basic_info info;
unsigned info_count;
info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host,
(processor_set_info_t) &info, &info_count)
!= KERN_SUCCESS)
{
InitLoadPoint();
info.load_average = 0;
}
*(double *)call_data = info.load_average * 1000 / LOAD_SCALE;
return;
}
#else
#ifdef __DARWIN__
#include <mach/mach.h>
static mach_port_t host_priv_port;
void InitLoadPoint()
{
host_priv_port = mach_host_self();
}
void GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
double *loadavg = (double *)call_data;
struct host_load_info load_data;
int host_count;
kern_return_t kr;
host_count = sizeof(load_data)/sizeof(integer_t);
kr = host_statistics(host_priv_port, HOST_LOAD_INFO,
(host_info_t)&load_data, &host_count);
if (kr != KERN_SUCCESS)
xload_error("cannot get host statistics", "");
*loadavg = (double)load_data.avenrun[0]/LOAD_SCALE;
return;
}
#else
#ifdef LOADSTUB
void InitLoadPoint()
{
}
void GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
*(double *)call_data = 1.0;
}
#else
#ifdef __osf__
void InitLoadPoint()
{
}
void GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
double *loadavg = (double *)call_data;
struct tbl_loadavg load_data;
if (table(TBL_LOADAVG, 0, (char *)&load_data, 1, sizeof(load_data)) < 0)
xload_error("error reading load average", "");
*loadavg = (load_data.tl_lscale == 0) ?
load_data.tl_avenrun.d[WHICH_AVG] :
load_data.tl_avenrun.l[WHICH_AVG] / (double)load_data.tl_lscale;
}
#else
#ifdef __QNXNTO__
#include <time.h>
#include <sys/neutrino.h>
static _Uint64t nto_idle = 0, nto_idle_last = 0;
static int nto_idle_id;
static struct timespec nto_now, nto_last;
void
InitLoadPoint()
{
nto_idle_id = ClockId(1, 1);
ClockTime(nto_idle_id, NULL, &nto_idle_last);
clock_gettime( CLOCK_REALTIME, &nto_last);
}
void
GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
double *loadavg = (double *)call_data;
double timediff;
double temp = 0.0;
ClockTime(nto_idle_id, NULL, &nto_idle);
clock_gettime( CLOCK_REALTIME, &nto_now);
timediff = 1000000000.0 * (nto_now.tv_sec - nto_last.tv_sec)
+ (nto_now.tv_nsec - nto_last.tv_nsec);
temp = 1.0 - (nto_idle-nto_idle_last)/timediff;
*loadavg = temp >= 0 ? temp : 0;
nto_idle_last = nto_idle;
nto_last = nto_now;
}
#else
#ifdef __bsdi__
#include <kvm.h>
static struct nlist nl[] = {
{ "_averunnable" },
#define X_AVERUNNABLE 0
{ "_fscale" },
#define X_FSCALE 1
{ "" },
};
static kvm_t *kd;
static int fscale;
void InitLoadPoint()
{
fixpt_t averunnable[3];
if ((kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL)) == NULL)
xload_error("can't open kvm files", "");
if (kvm_nlist(kd, nl) != 0)
xload_error("can't read name list", "");
if (kvm_read(kd, (off_t)nl[X_AVERUNNABLE].n_value, (char *)averunnable,
sizeof(averunnable)) != sizeof(averunnable))
xload_error("couldn't obtain _averunnable variable", "");
if (kvm_read(kd, (off_t)nl[X_FSCALE].n_value, (char *)&fscale,
sizeof(fscale)) != sizeof(fscale))
xload_error("couldn't obtain _fscale variable", "");
return;
}
void GetLoadPoint(w, closure, call_data)
Widget w;
XtPointer closure;
XtPointer call_data;
{
double *loadavg = (double *)call_data;
fixpt_t t;
if (kvm_read(kd, (off_t)nl[X_AVERUNNABLE].n_value, (char *)&t,
sizeof(t)) != sizeof(t))
xload_error("couldn't obtain load average", "");
*loadavg = (double)t/fscale;
return;
}
#else
#if defined(BSD) && (BSD >= 199306)
#include <stdlib.h>
void InitLoadPoint()
{
}
void GetLoadPoint(w, closure, call_data)
Widget w;
XtPointer closure;
XtPointer call_data;
{
double *loadavg = (double *)call_data;
if (getloadavg(loadavg, 1) < 0)
xload_error("couldn't obtain load average", "");
}
#else
#ifndef KMEM_FILE
#define KMEM_FILE "/dev/kmem"
#endif
#ifndef KERNEL_FILE
#ifdef alliant
#define KERNEL_FILE "/vmunix"
#endif
#ifdef CRAY
#define KERNEL_FILE "/unicos"
#endif
#ifdef hpux
#define KERNEL_FILE "/hp-ux"
#endif
#ifdef macII
#define KERNEL_FILE "/unix"
#endif
#ifdef umips
# ifdef SYSTYPE_SYSV
# define KERNEL_FILE "/unix"
# else
# define KERNEL_FILE "/vmunix"
# endif
#endif
#ifdef sequent
#define KERNEL_FILE "/dynix"
#endif
#ifdef hcx
#define KERNEL_FILE "/unix"
#endif
#ifdef MOTOROLA
#if defined(SYSV) && defined(m68k)
#define KERNEL_FILE "/sysV68"
#endif
#if defined(SYSV) && defined(m88k)
#define KERNEL_FILE "/unix"
#endif
#ifdef SVR4
#define KERNEL_FILE "/unix"
#endif
#endif
#if defined(sun) && defined(SVR4)
#define KERNEL_FILE "/kernel/unix"
#endif
#ifdef sgi
#if (OSMAJORVERSION > 4)
#define KERNEL_FILE "/unix"
#endif
#endif
#ifndef KERNEL_FILE
#ifdef SVR4
#define KERNEL_FILE "/stand/unix"
#else
#ifdef SYSV
#define KERNEL_FILE "/unix"
#else
# ifdef BSD
# include <paths.h>
# ifdef _PATH_UNIX
# define KERNEL_FILE _PATH_UNIX
# else
# ifdef _PATH_KERNEL
# define KERNEL_FILE _PATH_KERNEL
# else
# define KERNEL_FILE "/vmunix"
# endif
# endif
# else
# define KERNEL_FILE "/vmunix"
# endif
#endif
#endif
#endif
#endif
#ifndef KERNEL_LOAD_VARIABLE
# if defined(BSD) && (BSD >= 199103)
# define KERNEL_LOAD_VARIABLE "_averunnable"
# endif
# ifdef alliant
# define KERNEL_LOAD_VARIABLE "_Loadavg"
# endif
# ifdef CRAY
# if defined(CRAY2) && OSMAJORVERSION == 4
# define KERNEL_LOAD_VARIABLE "avenrun"
# else
# define KERNEL_LOAD_VARIABLE "sysinfo"
# define SYSINFO
# endif
# endif
# ifdef hpux
# ifdef __hp9000s800
# define KERNEL_LOAD_VARIABLE "avenrun"
# endif
# endif
# ifdef umips
# ifdef SYSTYPE_SYSV
# define KERNEL_LOAD_VARIABLE "avenrun"
# else
# define KERNEL_LOAD_VARIABLE "_avenrun"
# endif
# endif
# ifdef sgi
# define KERNEL_LOAD_VARIABLE "avenrun"
# endif
# ifdef AIXV3
# define KERNEL_LOAD_VARIABLE "sysinfo"
# endif
# ifdef MOTOROLA
# if defined(SYSV) && defined(m68k)
# define KERNEL_LOAD_VARIABLE "sysinfo"
# endif
# if defined(SYSV) && defined(m88k)
# define KERNEL_LOAD_VARIABLE "_sysinfo"
# endif
# ifdef SVR4
# define KERNEL_LOAD_VARIABLE "avenrun"
# endif
# endif
#endif
#ifndef KERNEL_LOAD_VARIABLE
# ifdef USG
# define KERNEL_LOAD_VARIABLE "sysinfo"
# define SYSINFO
# else
# ifdef SVR4
# define KERNEL_LOAD_VARIABLE "avenrun"
# else
# define KERNEL_LOAD_VARIABLE "_avenrun"
# endif
# endif
#endif
#ifdef macII
static struct var v;
static int pad[2];
static struct nlist nl[2];
static struct lavnum vec[3];
#else
static struct nlist namelist[] = {
#define LOADAV 0
{KERNEL_LOAD_VARIABLE},
{0}
};
#endif
static int kmem;
static long loadavg_seek;
void InitLoadPoint()
{
#ifdef macII
extern nlist();
int i;
strcpy(nl[0].n_name, "avenrun");
nl[1].n_name[0] = '\0';
kmem = open(KMEM_FILE, O_RDONLY);
if (kmem < 0) {
xload_error("cannot open", KMEM_FILE);
}
uvar(&v);
if (nlist( KERNEL_FILE, nl) != 0) {
xload_error("cannot get name list from", KERNEL_FILE);
}
for (i = 0; i < 2; i++) {
nl[i].n_value = (int)nl[i].n_value - v.v_kvoffset;
}
#else
#if defined(sun) && defined(SVR4) && (OSMAJORVERSION == 5) && (OSMINORVERSION > 3)
{
kvm_t *kd;
kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "xload");
if (kd == NULL)
{
xload_error("cannot get name list from", "kernel");
exit(-1);
}
if (kvm_nlist (kd, namelist) < 0 )
{
xload_error("cannot get name list from", "kernel");
exit(-1);
}
if (namelist[LOADAV].n_type == 0 ||
namelist[LOADAV].n_value == 0) {
xload_error("cannot get name list from", "kernel");
exit(-1);
}
loadavg_seek = namelist[LOADAV].n_value;
}
#else
#if (!defined(SVR4)) && !defined(sgi) && !defined(MOTOROLA) && !(BSD >= 199103)
extern void nlist();
#endif
#ifdef AIXV3
knlist( namelist, 1, sizeof(struct nlist));
#else
nlist( KERNEL_FILE, namelist);
#endif
#ifdef hcx
if (namelist[LOADAV].n_type == 0 &&
#else
if (namelist[LOADAV].n_type == 0 ||
#endif
namelist[LOADAV].n_value == 0) {
xload_error("cannot get name list from", KERNEL_FILE);
exit(-1);
}
loadavg_seek = namelist[LOADAV].n_value;
#if defined(umips) && defined(SYSTYPE_SYSV)
loadavg_seek &= 0x7fffffff;
#endif
#if (defined(CRAY) && defined(SYSINFO))
loadavg_seek += ((char *) (((struct sysinfo *)NULL)->avenrun)) -
((char *) NULL);
#endif
#endif
kmem = open(KMEM_FILE, O_RDONLY);
if (kmem < 0) xload_error("cannot open", KMEM_FILE);
#endif
}
void GetLoadPoint( w, closure, call_data )
Widget w;
XtPointer closure;
XtPointer call_data;
{
double *loadavg = (double *)call_data;
#ifdef macII
lseek(kmem, (long)nl[X_AVENRUN].n_value, 0);
#else
(void) lseek(kmem, loadavg_seek, 0);
#endif
#if defined(sun) || defined (UTEK) || defined(sequent) || defined(alliant) || defined(SVR4) || defined(sgi) || defined(hcx) || (BSD >= 199103)
{
long temp;
(void) read(kmem, (char *)&temp, sizeof(long));
*loadavg = (double)temp/FSCALE;
}
#else
# ifdef macII
{
read(kmem, vec, 3*sizeof(struct lavnum));
*loadavg = fxtod(0);
}
# else
# if defined(umips) || (defined(ultrix) && defined(mips))
{
fix temp;
(void) read(kmem, (char *)&temp, sizeof(fix));
*loadavg = FIX_TO_DBL(temp);
}
# else
# ifdef AIXV3
{
struct sysinfo sysinfo_now;
struct sysinfo sysinfo_last;
static firsttime = TRUE;
static double runavg = 0.0, swpavg = 0.0;
(void) lseek(kmem, loadavg_seek, 0);
(void) read(kmem, (char *)&sysinfo_last, sizeof(struct sysinfo));
if (firsttime)
{
*loadavg = 0.0;
firsttime = FALSE;
}
else
{
sleep(1);
(void) lseek(kmem, loadavg_seek, 0);
(void) read(kmem, (char *)&sysinfo_now, sizeof(struct sysinfo));
runavg *= 0.8; swpavg *= 0.8;
if (sysinfo_now.runocc != sysinfo_last.runocc)
runavg += 0.2*((sysinfo_now.runque - sysinfo_last.runque - 1)
/(double)(sysinfo_now.runocc - sysinfo_last.runocc));
if (sysinfo_now.swpocc != sysinfo_last.swpocc)
swpavg += 0.2*((sysinfo_now.swpque - sysinfo_last.swpque)
/(double)(sysinfo_now.swpocc - sysinfo_last.swpocc));
*loadavg = runavg + swpavg;
sysinfo_last = sysinfo_now;
}
}
# else
# if defined(MOTOROLA) && defined(SYSV)
{
static int init = 0;
static kmem;
static long loadavg_seek;
#define CEXP 0.25
struct sysinfo sysinfod;
static double oldloadavg;
static double cexp = CEXP;
static long sv_rq, sv_oc;
double rq, oc;
if (!init)
{
if (nlist(KERNEL_FILE,namelist) == -1)
{
perror("xload: nlist()");
xload_error("cannot get name list from", KERNEL_FILE);
}
loadavg_seek = namelist[0].n_value;
kmem = open(KMEM_FILE, O_RDONLY);
if (kmem < 0)
{
perror("xload: open()");
xload_error("cannot open", KMEM_FILE);
}
}
lseek(kmem, loadavg_seek, 0);
if (read(kmem, &sysinfod, (int) sizeof (struct sysinfo)) == -1)
{
perror("xload: read() SYSINFONL");
xload_error("read failed from", KMEM_FILE);
}
if (!init)
{
init = 1;
sv_rq = sysinfod.runque;
sv_oc = sysinfod.runocc;
oldloadavg = *loadavg = 0.0;
return;
}
rq = (double) sysinfod.runque - sv_rq;
oc = (double) sysinfod.runocc - sv_oc;
sv_rq = sysinfod.runque;
sv_oc = sysinfod.runocc;
if (oc == 0.0)
{
*loadavg = (1.0 - cexp) * oldloadavg;
}
else
{
*loadavg = ((1.0 - cexp) * oldloadavg) + ((rq / oc) * cexp);
}
oldloadavg = *loadavg;
}
# else
# if defined(sony) && OSMAJORVERSION == 4
# ifdef mips
{
fix temp;
(void) read(kmem, (char *)&temp, sizeof(fix));
*loadavg = FIX_TO_DBL(temp);
}
# else
{
long temp;
(void) read(kmem, (char *)&temp, sizeof(long));
*loadavg = (double)temp/FSCALE;
}
# endif
# else
(void) read(kmem, (char *)loadavg, sizeof(double));
# endif
# endif
# endif
# endif
# endif
#endif
return;
}
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
void xload_error(str1, str2)
char *str1, *str2;
{
(void) fprintf(stderr,"xload: %s %s\n", str1, str2);
#ifdef __bsdi__
if (kd)
kvm_close(kd);
#endif
exit(-1);
}
#endif
#else
#include <errno.h>
#include <nlist.h>
#include <sys/dg_sys_info.h>
static struct dg_sys_info_load_info load_info;
#define KERNEL_FILE "/dgux"
#define LDAV_SYMBOL "_avenrun"
void InitLoadPoint()
{
}
void GetLoadPoint(w, closure, call_data)
Widget w;
XtPointer closure;
XtPointer call_data;
{
double *loadavg = (double *)call_data;
if (getloadavg(loadavg, 1) < 0)
xload_error("couldn't obtain load average", "");
}
xload_error(str1, str2)
char *str1, *str2;
{
(void) fprintf(stderr,"xload: %s %s\n", str1, str2);
exit(-1);
}
#if !defined (LDAV_CVT) && defined (FSCALE)
#define LDAV_CVT(n) (((double) (n)) / FSCALE)
#endif
#if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT)
#define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0)
#endif
#define LOAD_AVE_TYPE double
#ifndef LDAV_CVT
#define LDAV_CVT(n) ((double) (n))
#endif
static int channel;
static int getloadavg_initialized;
static long offset;
static struct nlist nl[2];
int
getloadavg (double loadavg[], int nelem)
{
int elem = 0;
int result =0 ;
result = dg_sys_info ((long int *) &load_info,
DG_SYS_INFO_LOAD_INFO_TYPE, DG_SYS_INFO_LOAD_VERSION_0);
if ( result == -1)
{
return(-1);
}
if (nelem > 0)
loadavg[elem++] = load_info.one_minute;
if (nelem > 1)
loadavg[elem++] = load_info.five_minute;
if (nelem > 2)
loadavg[elem++] = load_info.fifteen_minute;
return elem;
}
#endif