Mercurial > emacs
changeset 16869:16ef2bd09de7
[hpux && HAVE_PSTAT_GETDYNAMIC]: Use HPUX's pstat_getdynamic so
we don't need any special privileges to determine load averages.
Patch from Kaveh Ghazi, based on a sample implementation from
Richard J. Rauenzahn.
Indent cpp-directives to reflect nesting.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Thu, 16 Jan 1997 03:33:02 +0000 |
parents | 97f000e93516 |
children | 4a5fa29f79d6 |
files | src/getloadavg.c |
diffstat | 1 files changed, 393 insertions(+), 363 deletions(-) [+] |
line wrap: on
line diff
--- a/src/getloadavg.c Wed Jan 15 20:24:01 1997 +0000 +++ b/src/getloadavg.c Thu Jan 16 03:33:02 1997 +0000 @@ -65,7 +65,7 @@ /* This should always be first. */ #ifdef HAVE_CONFIG_H -#include <config.h> +# include <config.h> #endif #include <sys/types.h> @@ -74,7 +74,7 @@ configuration files' definitions for the LOAD_AVE_CVT macro (like sparc.h's) use macros like FSCALE, defined here. */ #ifdef unix -#include <sys/param.h> +# include <sys/param.h> #endif @@ -103,25 +103,25 @@ LOAD_AVE_CVT, but future machine config files should just define LDAV_CVT directly. */ -#if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT) -#define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0) -#endif +# if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT) +# define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0) +# endif -#if !defined (BSD) && defined (ultrix) +# if !defined (BSD) && defined (ultrix) /* Ultrix behaves like BSD on Vaxen. */ -#define BSD -#endif +# define BSD +# endif -#ifdef NeXT +# ifdef NeXT /* NeXT in the 2.{0,1,2} releases defines BSD in <sys/param.h>, which conflicts with the definition understood in this file, that this really is BSD. */ -#undef BSD +# undef BSD /* NeXT defines FSCALE in <sys/param.h>. However, we take FSCALE being defined to mean that the nlist method should be used, which is not true. */ -#undef FSCALE -#endif +# undef FSCALE +# endif /* Set values that are different from the defaults, which are set a little farther down with #ifndef. */ @@ -129,365 +129,375 @@ /* Some shorthands. */ -#if defined (HPUX) && !defined (hpux) -#define hpux -#endif +# if defined (HPUX) && !defined (hpux) +# define hpux +# endif -#if defined (__hpux) && !defined (hpux) -#define hpux -#endif +# if defined (__hpux) && !defined (hpux) +# define hpux +# endif -#if defined (__sun) && !defined (sun) -#define sun -#endif +# if defined (__sun) && !defined (sun) +# define sun +# endif -#if defined(hp300) && !defined(hpux) -#define MORE_BSD -#endif +# if defined(hp300) && !defined(hpux) +# define MORE_BSD +# endif -#if defined(ultrix) && defined(mips) -#define decstation -#endif +# if defined(ultrix) && defined(mips) +# define decstation +# endif -#if (defined(sun) && defined(SVR4)) || defined (SOLARIS2) -#define SUNOS_5 -#endif +# if defined (__SVR4) && !defined (SVR4) +# define SVR4 +# endif -#if defined (__osf__) && (defined (__alpha) || defined (__alpha__)) -#define OSF_ALPHA -#include <sys/table.h> -#endif +# if (defined(sun) && defined(SVR4)) || defined (SOLARIS2) +# define SUNOS_5 +# endif -#if defined (__osf__) && (defined (mips) || defined (__mips__)) -#define OSF_MIPS -#include <sys/table.h> -#endif +# if defined (__osf__) && (defined (__alpha) || defined (__alpha__)) +# define OSF_ALPHA +# include <sys/table.h> +# endif + +# if defined (__osf__) && (defined (mips) || defined (__mips__)) +# define OSF_MIPS +# include <sys/table.h> +# endif /* UTek's /bin/cc on the 4300 has no architecture specific cpp define by default, but _MACH_IND_SYS_TYPES is defined in <sys/types.h>. Combine that with a couple of other things and we'll have a unique match. */ -#if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES) -#define tek4300 /* Define by emacs, but not by other users. */ -#endif +# if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES) +# define tek4300 /* Define by emacs, but not by other users. */ +# endif /* VAX C can't handle multi-line #ifs, or lines longer than 256 chars. */ -#ifndef LOAD_AVE_TYPE +# ifndef LOAD_AVE_TYPE -#ifdef MORE_BSD -#define LOAD_AVE_TYPE long -#endif +# ifdef MORE_BSD +# define LOAD_AVE_TYPE long +# endif -#ifdef sun -#define LOAD_AVE_TYPE long -#endif +# ifdef sun +# define LOAD_AVE_TYPE long +# endif -#ifdef decstation -#define LOAD_AVE_TYPE long -#endif +# ifdef decstation +# define LOAD_AVE_TYPE long +# endif -#ifdef _SEQUENT_ -#define LOAD_AVE_TYPE long -#endif +# ifdef _SEQUENT_ +# define LOAD_AVE_TYPE long +# endif -#ifdef sgi -#define LOAD_AVE_TYPE long -#endif +# ifdef sgi +# define LOAD_AVE_TYPE long +# endif -#ifdef SVR4 -#define LOAD_AVE_TYPE long -#endif +# ifdef SVR4 +# define LOAD_AVE_TYPE long +# endif -#ifdef sony_news -#define LOAD_AVE_TYPE long -#endif +# ifdef sony_news +# define LOAD_AVE_TYPE long +# endif -#ifdef sequent -#define LOAD_AVE_TYPE long -#endif +# ifdef sequent +# define LOAD_AVE_TYPE long +# endif -#ifdef OSF_ALPHA -#define LOAD_AVE_TYPE long -#endif +# ifdef OSF_ALPHA +# define LOAD_AVE_TYPE long +# endif -#if defined (ardent) && defined (titan) -#define LOAD_AVE_TYPE long -#endif +# if defined (ardent) && defined (titan) +# define LOAD_AVE_TYPE long +# endif -#ifdef tek4300 -#define LOAD_AVE_TYPE long -#endif +# ifdef tek4300 +# define LOAD_AVE_TYPE long +# endif -#if defined(alliant) && defined(i860) /* Alliant FX/2800 */ -#define LOAD_AVE_TYPE long -#endif +# if defined(alliant) && defined(i860) /* Alliant FX/2800 */ +# define LOAD_AVE_TYPE long +# endif -#ifdef _AIX -#define LOAD_AVE_TYPE long -#endif +# ifdef _AIX +# define LOAD_AVE_TYPE long +# endif -#ifdef convex -#define LOAD_AVE_TYPE double -#ifndef LDAV_CVT -#define LDAV_CVT(n) (n) -#endif -#endif +# ifdef convex +# define LOAD_AVE_TYPE double +# ifndef LDAV_CVT +# define LDAV_CVT(n) (n) +# endif +# endif -#endif /* No LOAD_AVE_TYPE. */ +# endif /* No LOAD_AVE_TYPE. */ -#ifdef OSF_ALPHA +# ifdef OSF_ALPHA /* <sys/param.h> defines an incorrect value for FSCALE on Alpha OSF/1, according to ghazi@noc.rutgers.edu. */ -#undef FSCALE -#define FSCALE 1024.0 -#endif +# undef FSCALE +# define FSCALE 1024.0 +# endif -#if defined(alliant) && defined(i860) /* Alliant FX/2800 */ +# if defined(alliant) && defined(i860) /* Alliant FX/2800 */ /* <sys/param.h> defines an incorrect value for FSCALE on an Alliant FX/2800 Concentrix 2.2, according to ghazi@noc.rutgers.edu. */ -#undef FSCALE -#define FSCALE 100.0 -#endif +# undef FSCALE +# define FSCALE 100.0 +# endif -#ifndef FSCALE +# ifndef FSCALE /* SunOS and some others define FSCALE in sys/param.h. */ -#ifdef MORE_BSD -#define FSCALE 2048.0 -#endif +# ifdef MORE_BSD +# define FSCALE 2048.0 +# endif -#if defined(MIPS) || defined(SVR4) || defined(decstation) -#define FSCALE 256 -#endif +# if defined(MIPS) || defined(SVR4) || defined(decstation) +# define FSCALE 256 +# endif -#if defined (sgi) || defined (sequent) +# if defined (sgi) || defined (sequent) /* Sometimes both MIPS and sgi are defined, so FSCALE was just defined above under #ifdef MIPS. But we want the sgi value. */ -#undef FSCALE -#define FSCALE 1000.0 -#endif +# undef FSCALE +# define FSCALE 1000.0 +# endif -#if defined (ardent) && defined (titan) -#define FSCALE 65536.0 -#endif +# if defined (ardent) && defined (titan) +# define FSCALE 65536.0 +# endif -#ifdef tek4300 -#define FSCALE 100.0 -#endif +# ifdef tek4300 +# define FSCALE 100.0 +# endif -#ifdef _AIX -#define FSCALE 65536.0 -#endif +# ifdef _AIX +# define FSCALE 65536.0 +# endif -#endif /* Not FSCALE. */ +# endif /* Not FSCALE. */ -#if !defined (LDAV_CVT) && defined (FSCALE) -#define LDAV_CVT(n) (((double) (n)) / FSCALE) -#endif +# if !defined (LDAV_CVT) && defined (FSCALE) +# define LDAV_CVT(n) (((double) (n)) / FSCALE) +# endif /* VAX C can't handle multi-line #ifs, or lines longer that 256 characters. */ -#ifndef NLIST_STRUCT +# ifndef NLIST_STRUCT -#ifdef MORE_BSD -#define NLIST_STRUCT -#endif +# ifdef MORE_BSD +# define NLIST_STRUCT +# endif -#ifdef sun -#define NLIST_STRUCT -#endif +# ifdef sun +# define NLIST_STRUCT +# endif -#ifdef decstation -#define NLIST_STRUCT -#endif +# ifdef decstation +# define NLIST_STRUCT +# endif -#ifdef hpux -#define NLIST_STRUCT -#endif +# ifdef hpux +# define NLIST_STRUCT +# endif -#if defined (_SEQUENT_) || defined (sequent) -#define NLIST_STRUCT -#endif +# if defined (_SEQUENT_) || defined (sequent) +# define NLIST_STRUCT +# endif -#ifdef sgi -#define NLIST_STRUCT -#endif +# ifdef sgi +# define NLIST_STRUCT +# endif -#ifdef SVR4 -#define NLIST_STRUCT -#endif +# ifdef SVR4 +# define NLIST_STRUCT +# endif -#ifdef sony_news -#define NLIST_STRUCT -#endif +# ifdef sony_news +# define NLIST_STRUCT +# endif -#ifdef OSF_ALPHA -#define NLIST_STRUCT -#endif +# ifdef OSF_ALPHA +# define NLIST_STRUCT +# endif -#if defined (ardent) && defined (titan) -#define NLIST_STRUCT -#endif +# if defined (ardent) && defined (titan) +# define NLIST_STRUCT +# endif -#ifdef tek4300 -#define NLIST_STRUCT -#endif +# ifdef tek4300 +# define NLIST_STRUCT +# endif -#ifdef butterfly -#define NLIST_STRUCT -#endif +# ifdef butterfly +# define NLIST_STRUCT +# endif -#if defined(alliant) && defined(i860) /* Alliant FX/2800 */ -#define NLIST_STRUCT -#endif +# if defined(alliant) && defined(i860) /* Alliant FX/2800 */ +# define NLIST_STRUCT +# endif -#ifdef _AIX -#define NLIST_STRUCT -#endif +# ifdef _AIX +# define NLIST_STRUCT +# endif -#endif /* defined (NLIST_STRUCT) */ +# endif /* defined (NLIST_STRUCT) */ -#if defined(sgi) || (defined(mips) && !defined(BSD)) -#define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31)) -#endif +# if defined(sgi) || (defined(mips) && !defined(BSD)) +# define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31)) +# endif -#if !defined (KERNEL_FILE) && defined (sequent) -#define KERNEL_FILE "/dynix" -#endif +# if !defined (KERNEL_FILE) && defined (sequent) +# define KERNEL_FILE "/dynix" +# endif -#if !defined (KERNEL_FILE) && defined (hpux) -#define KERNEL_FILE "/hp-ux" -#endif +# if !defined (KERNEL_FILE) && defined (hpux) +# define KERNEL_FILE "/hp-ux" +# endif -#if !defined(KERNEL_FILE) && (defined(_SEQUENT_) || defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || defined(SVR4) || (defined (ardent) && defined (titan))) -#define KERNEL_FILE "/unix" -#endif +# if !defined(KERNEL_FILE) && (defined(_SEQUENT_) || defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || (defined (ardent) && defined (titan))) +# define KERNEL_FILE "/unix" +# endif -#if !defined (LDAV_SYMBOL) && defined (alliant) -#define LDAV_SYMBOL "_Loadavg" -#endif +# if !defined (LDAV_SYMBOL) && defined (alliant) +# define LDAV_SYMBOL "_Loadavg" +# endif -#if !defined(LDAV_SYMBOL) && ((defined(hpux) && !defined(hp9000s300)) || defined(_SEQUENT_) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX)) -#define LDAV_SYMBOL "avenrun" -#endif +# if !defined(LDAV_SYMBOL) && ((defined(hpux) && !defined(hp9000s300)) || defined(_SEQUENT_) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX)) +# define LDAV_SYMBOL "avenrun" +# endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif +# ifdef HAVE_UNISTD_H +# include <unistd.h> +# endif -#include <stdio.h> +# include <stdio.h> /* LOAD_AVE_TYPE should only get defined if we're going to use the nlist method. */ -#if !defined(LOAD_AVE_TYPE) && (defined(BSD) || defined(LDAV_CVT) || defined(KERNEL_FILE) || defined(LDAV_SYMBOL)) -#define LOAD_AVE_TYPE double -#endif +# if !defined(LOAD_AVE_TYPE) && (defined(BSD) || defined(LDAV_CVT) || defined(KERNEL_FILE) || defined(LDAV_SYMBOL)) +# define LOAD_AVE_TYPE double +# endif -#ifdef LOAD_AVE_TYPE +# ifdef LOAD_AVE_TYPE -#ifndef VMS -#ifndef NLIST_STRUCT -#include <a.out.h> -#else /* NLIST_STRUCT */ -#include <nlist.h> -#endif /* NLIST_STRUCT */ +# ifndef VMS +# ifndef __linux__ +# ifndef NLIST_STRUCT +# include <a.out.h> +# else /* NLIST_STRUCT */ +# include <nlist.h> +# endif /* NLIST_STRUCT */ -#ifdef SUNOS_5 -#include <fcntl.h> -#include <kvm.h> -#include <kstat.h> -#endif +# ifdef SUNOS_5 +# include <fcntl.h> +# include <kvm.h> +# include <kstat.h> +# endif -#ifndef KERNEL_FILE -#define KERNEL_FILE "/vmunix" -#endif /* KERNEL_FILE */ +# if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) +# include <sys/pstat.h> +# endif -#ifndef LDAV_SYMBOL -#define LDAV_SYMBOL "_avenrun" -#endif /* LDAV_SYMBOL */ +# ifndef KERNEL_FILE +# define KERNEL_FILE "/vmunix" +# endif /* KERNEL_FILE */ -#else /* VMS */ +# ifndef LDAV_SYMBOL +# define LDAV_SYMBOL "_avenrun" +# endif /* LDAV_SYMBOL */ +# endif /* __linux__ */ -#ifndef eunice -#include <iodef.h> -#include <descrip.h> -#else /* eunice */ -#include <vms/iodef.h> -#endif /* eunice */ -#endif /* VMS */ +# else /* VMS */ -#ifndef LDAV_CVT -#define LDAV_CVT(n) ((double) (n)) -#endif /* !LDAV_CVT */ +# ifndef eunice +# include <iodef.h> +# include <descrip.h> +# else /* eunice */ +# include <vms/iodef.h> +# endif /* eunice */ +# endif /* VMS */ -#endif /* LOAD_AVE_TYPE */ +# ifndef LDAV_CVT +# define LDAV_CVT(n) ((double) (n)) +# endif /* !LDAV_CVT */ -#ifdef NeXT -#ifdef HAVE_MACH_MACH_H -#include <mach/mach.h> -#else -#include <mach.h> -#endif -#endif /* NeXT */ +# endif /* LOAD_AVE_TYPE */ + +# ifdef NeXT +# ifdef HAVE_MACH_MACH_H +# include <mach/mach.h> +# else +# include <mach.h> +# endif +# endif /* NeXT */ -#ifdef sgi -#include <sys/sysmp.h> -#endif /* sgi */ +# ifdef sgi +# include <sys/sysmp.h> +# endif /* sgi */ -#ifdef UMAX -#include <stdio.h> -#include <signal.h> -#include <sys/time.h> -#include <sys/wait.h> -#include <sys/syscall.h> +# ifdef UMAX +# include <stdio.h> +# include <signal.h> +# include <sys/time.h> +# include <sys/wait.h> +# include <sys/syscall.h> -#ifdef UMAX_43 -#include <machine/cpu.h> -#include <inq_stats/statistics.h> -#include <inq_stats/sysstats.h> -#include <inq_stats/cpustats.h> -#include <inq_stats/procstats.h> -#else /* Not UMAX_43. */ -#include <sys/sysdefs.h> -#include <sys/statistics.h> -#include <sys/sysstats.h> -#include <sys/cpudefs.h> -#include <sys/cpustats.h> -#include <sys/procstats.h> -#endif /* Not UMAX_43. */ -#endif /* UMAX */ +# ifdef UMAX_43 +# include <machine/cpu.h> +# include <inq_stats/statistics.h> +# include <inq_stats/sysstats.h> +# include <inq_stats/cpustats.h> +# include <inq_stats/procstats.h> +# else /* Not UMAX_43. */ +# include <sys/sysdefs.h> +# include <sys/statistics.h> +# include <sys/sysstats.h> +# include <sys/cpudefs.h> +# include <sys/cpustats.h> +# include <sys/procstats.h> +# endif /* Not UMAX_43. */ +# endif /* UMAX */ -#ifdef DGUX -#include <sys/dg_sys_info.h> -#endif +# ifdef DGUX +# include <sys/dg_sys_info.h> +# endif -#if defined(HAVE_FCNTL_H) || defined(_POSIX_VERSION) -#include <fcntl.h> -#else -#include <sys/file.h> -#endif +# if defined(HAVE_FCNTL_H) || defined(_POSIX_VERSION) +# include <fcntl.h> +# else +# include <sys/file.h> +# endif /* Avoid static vars inside a function since in HPUX they dump as pure. */ -#ifdef NeXT +# ifdef NeXT static processor_set_t default_set; static int getloadavg_initialized; -#endif /* NeXT */ +# endif /* NeXT */ -#ifdef UMAX +# ifdef UMAX static unsigned int cpus = 0; static unsigned int samples; -#endif /* UMAX */ +# endif /* UMAX */ -#ifdef DGUX +# ifdef DGUX static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */ -#endif /* DGUX */ +# endif /* DGUX */ -#ifdef LOAD_AVE_TYPE +# ifdef LOAD_AVE_TYPE /* File descriptor open to /dev/kmem or VMS load ave driver. */ static int channel; /* Nonzero iff channel is valid. */ @@ -495,15 +505,15 @@ /* Offset in kmem to seek to read load average, or 0 means invalid. */ static long offset; -#if !defined(VMS) && !defined(sgi) +# if !defined(VMS) && !defined(sgi) && !defined(__linux__) static struct nlist nl[2]; -#endif /* Not VMS or sgi */ +# endif /* Not VMS or sgi */ -#ifdef SUNOS_5 +# ifdef SUNOS_5 static kvm_t *kd; -#endif /* SUNOS_5 */ +# endif /* SUNOS_5 */ -#endif /* LOAD_AVE_TYPE */ +# endif /* LOAD_AVE_TYPE */ /* Put the 1 minute, 5 minute and 15 minute load averages into the first NELEM elements of LOADAVG. @@ -517,26 +527,29 @@ { int elem = 0; /* Return value. */ -#ifdef NO_GET_LOAD_AVG -#define LDAV_DONE +# ifdef NO_GET_LOAD_AVG +# define LDAV_DONE /* Set errno to zero to indicate that there was no particular error; this function just can't work at all on this system. */ errno = 0; elem = -1; -#endif +# endif -#if !defined (LDAV_DONE) && defined (SUNOS_5) +# if !defined (LDAV_DONE) && defined (SUNOS_5) /* Use libkstat because we don't have to be root. */ -#define LDAV_DONE +# define LDAV_DONE kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *kn; kc = kstat_open (); - if (kc == 0) return -1; + if (kc == 0) + return -1; ksp = kstat_lookup (kc, "unix", 0, "system_misc"); - if (ksp == 0 ) return -1; - if (kstat_read (kc, ksp, 0) == -1) return -1; + if (ksp == 0 ) + return -1; + if (kstat_read (kc, ksp, 0) == -1) + return -1; kn = kstat_data_lookup (ksp, "avenrun_1min"); @@ -567,15 +580,32 @@ } kstat_close (kc); -#endif /* SUNOS_5 */ +# endif /* SUNOS_5 */ + +# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) +/* Use pstat_getdynamic() because we don't have to be root. */ +# define LDAV_DONE +# undef LOAD_AVE_TYPE -#if !defined (LDAV_DONE) && defined (__linux__) -#define LDAV_DONE -#undef LOAD_AVE_TYPE + struct pst_dynamic dyn_info; + if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0) + return -1; + if (nelem > 0) + loadavg[elem++] = dyn_info.psd_avg_1_min; + if (nelem > 1) + loadavg[elem++] = dyn_info.psd_avg_5_min; + if (nelem > 2) + loadavg[elem++] = dyn_info.psd_avg_15_min; -#ifndef LINUX_LDAV_FILE -#define LINUX_LDAV_FILE "/proc/loadavg" -#endif +# endif /* hpux && HAVE_PSTAT_GETDYNAMIC */ + +# if !defined (LDAV_DONE) && defined (__linux__) +# define LDAV_DONE +# undef LOAD_AVE_TYPE + +# ifndef LINUX_LDAV_FILE +# define LINUX_LDAV_FILE "/proc/loadavg" +# endif char ldavgbuf[40]; double load_ave[3]; @@ -599,15 +629,15 @@ return elem; -#endif /* __linux__ */ +# endif /* __linux__ */ -#if !defined (LDAV_DONE) && defined (__NetBSD__) -#define LDAV_DONE -#undef LOAD_AVE_TYPE +# if !defined (LDAV_DONE) && defined (__NetBSD__) +# define LDAV_DONE +# undef LOAD_AVE_TYPE -#ifndef NETBSD_LDAV_FILE -#define NETBSD_LDAV_FILE "/kern/loadavg" -#endif +# ifndef NETBSD_LDAV_FILE +# define NETBSD_LDAV_FILE "/kern/loadavg" +# endif unsigned long int load_ave[3], scale; int count; @@ -628,10 +658,10 @@ return elem; -#endif /* __NetBSD__ */ +# endif /* __NetBSD__ */ -#if !defined (LDAV_DONE) && defined (NeXT) -#define LDAV_DONE +# if !defined (LDAV_DONE) && defined (NeXT) +# define LDAV_DONE /* The NeXT code was adapted from iscreen 3.2. */ host_t host; @@ -651,7 +681,7 @@ { 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) + (processor_set_info_t) &info, &info_count) != KERN_SUCCESS) getloadavg_initialized = 0; else @@ -663,10 +693,10 @@ if (!getloadavg_initialized) return -1; -#endif /* NeXT */ +# endif /* NeXT */ -#if !defined (LDAV_DONE) && defined (UMAX) -#define LDAV_DONE +# if !defined (LDAV_DONE) && defined (UMAX) +# define LDAV_DONE /* UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not have a /dev/kmem. Information about the workings of the running kernel can be gathered with inq_stats system calls. @@ -733,10 +763,10 @@ if (nelem > 0) loadavg[elem++] = load / samples / cpus; -#endif /* UMAX */ +# endif /* UMAX */ -#if !defined (LDAV_DONE) && defined (DGUX) -#define LDAV_DONE +# if !defined (LDAV_DONE) && defined (DGUX) +# define LDAV_DONE /* This call can return -1 for an error, but with good args it's not supposed to fail. The first argument is for no apparent reason of type `long int *'. */ @@ -750,10 +780,10 @@ loadavg[elem++] = load_info.five_minute; if (nelem > 2) loadavg[elem++] = load_info.fifteen_minute; -#endif /* DGUX */ +# endif /* DGUX */ -#if !defined (LDAV_DONE) && defined (apollo) -#define LDAV_DONE +# if !defined (LDAV_DONE) && defined (apollo) +# define LDAV_DONE /* Apollo code from lisch@mentorg.com (Ray Lischner). This system call is not documented. The load average is obtained as @@ -775,10 +805,10 @@ loadavg[elem++] = load_ave[1] / 65536.0; if (nelem > 2) loadavg[elem++] = load_ave[2] / 65536.0; -#endif /* apollo */ +# endif /* apollo */ -#if !defined (LDAV_DONE) && defined (OSF_MIPS) -#define LDAV_DONE +# if !defined (LDAV_DONE) && defined (OSF_MIPS) +# define LDAV_DONE struct tbl_loadavg load_ave; table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave)); @@ -786,20 +816,20 @@ = (load_ave.tl_lscale == 0 ? load_ave.tl_avenrun.d[0] : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale)); -#endif /* OSF_MIPS */ +# endif /* OSF_MIPS */ -#if !defined (LDAV_DONE) && (defined (MSDOS) || defined (WIN32)) -#define LDAV_DONE +# if !defined (LDAV_DONE) && (defined (MSDOS) || defined (WIN32)) +# define LDAV_DONE /* A faithful emulation is going to have to be saved for a rainy day. */ for ( ; elem < nelem; elem++) { loadavg[elem] = 0.0; } -#endif /* MSDOS */ +# endif /* MSDOS */ -#if !defined (LDAV_DONE) && defined (OSF_ALPHA) -#define LDAV_DONE +# if !defined (LDAV_DONE) && defined (OSF_ALPHA) +# define LDAV_DONE struct tbl_loadavg load_ave; table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave)); @@ -808,31 +838,31 @@ = (load_ave.tl_lscale == 0 ? load_ave.tl_avenrun.d[elem] : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale)); -#endif /* OSF_ALPHA */ +# endif /* OSF_ALPHA */ -#if !defined (LDAV_DONE) && defined (VMS) +# if !defined (LDAV_DONE) && defined (VMS) /* VMS specific code -- read from the Load Ave driver. */ LOAD_AVE_TYPE load_ave[3]; static int getloadavg_initialized = 0; -#ifdef eunice +# ifdef eunice struct { int dsc$w_length; char *dsc$a_pointer; } descriptor; -#endif +# endif /* Ensure that there is a channel open to the load ave device. */ if (!getloadavg_initialized) { /* Attempt to open the channel. */ -#ifdef eunice +# ifdef eunice descriptor.dsc$w_length = 18; descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE"; -#else +# else $DESCRIPTOR (descriptor, "LAV0:"); -#endif +# endif if (sys$assign (&descriptor, &channel, 0, 0) & 1) getloadavg_initialized = 1; } @@ -848,76 +878,76 @@ if (!getloadavg_initialized) return -1; -#endif /* VMS */ +# endif /* VMS */ -#if !defined (LDAV_DONE) && defined(LOAD_AVE_TYPE) && !defined(VMS) +# if !defined (LDAV_DONE) && defined(LOAD_AVE_TYPE) && !defined(VMS) /* UNIX-specific code -- read the average from /dev/kmem. */ -#define LDAV_PRIVILEGED /* This code requires special installation. */ +# define LDAV_PRIVILEGED /* This code requires special installation. */ LOAD_AVE_TYPE load_ave[3]; /* Get the address of LDAV_SYMBOL. */ if (offset == 0) { -#ifndef sgi -#ifndef NLIST_STRUCT +# ifndef sgi +# ifndef NLIST_STRUCT strcpy (nl[0].n_name, LDAV_SYMBOL); strcpy (nl[1].n_name, ""); -#else /* NLIST_STRUCT */ -#ifdef NLIST_NAME_UNION +# else /* NLIST_STRUCT */ +# ifdef NLIST_NAME_UNION nl[0].n_un.n_name = LDAV_SYMBOL; nl[1].n_un.n_name = 0; -#else /* not NLIST_NAME_UNION */ +# else /* not NLIST_NAME_UNION */ nl[0].n_name = LDAV_SYMBOL; nl[1].n_name = 0; -#endif /* not NLIST_NAME_UNION */ -#endif /* NLIST_STRUCT */ +# endif /* not NLIST_NAME_UNION */ +# endif /* NLIST_STRUCT */ -#ifndef SUNOS_5 +# ifndef SUNOS_5 if ( -#if !(defined (_AIX) && !defined (ps2)) +# if !(defined (_AIX) && !defined (ps2)) nlist (KERNEL_FILE, nl) -#else /* _AIX */ +# else /* _AIX */ knlist (nl, 1, sizeof (nl[0])) -#endif +# endif >= 0) /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */ { -#ifdef FIXUP_KERNEL_SYMBOL_ADDR +# ifdef FIXUP_KERNEL_SYMBOL_ADDR FIXUP_KERNEL_SYMBOL_ADDR (nl); -#endif +# endif offset = nl[0].n_value; } -#endif /* !SUNOS_5 */ -#else /* sgi */ - int ldav_off; +# endif /* !SUNOS_5 */ +# else /* sgi */ + int ldav_off; - ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN); - if (ldav_off != -1) - offset = (long) ldav_off & 0x7fffffff; -#endif /* sgi */ - } + ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN); + if (ldav_off != -1) + offset = (long) ldav_off & 0x7fffffff; +# endif /* sgi */ + } /* Make sure we have /dev/kmem open. */ if (!getloadavg_initialized) { -#ifndef SUNOS_5 +# ifndef SUNOS_5 channel = open ("/dev/kmem", 0); if (channel >= 0) { /* Set the channel to close on exec, so it does not litter any child's descriptor table. */ -#ifdef FD_SETFD -#ifndef FD_CLOEXEC -#define FD_CLOEXEC 1 -#endif +# ifdef FD_SETFD +# ifndef FD_CLOEXEC +# define FD_CLOEXEC 1 +# endif (void) fcntl (channel, F_SETFD, FD_CLOEXEC); -#endif +# endif getloadavg_initialized = 1; } -#else /* SUNOS_5 */ +# else /* SUNOS_5 */ /* We pass 0 for the kernel, corefile, and swapfile names to use the currently running kernel. */ kd = kvm_open (0, 0, 0, O_RDONLY, 0); @@ -928,14 +958,14 @@ offset = nl[0].n_value; getloadavg_initialized = 1; } -#endif /* SUNOS_5 */ +# endif /* SUNOS_5 */ } /* If we can, get the load average values. */ if (offset && getloadavg_initialized) { /* Try to read the load. */ -#ifndef SUNOS_5 +# ifndef SUNOS_5 if (lseek (channel, offset, 0) == -1L || read (channel, (char *) load_ave, sizeof (load_ave)) != sizeof (load_ave)) @@ -943,21 +973,21 @@ close (channel); getloadavg_initialized = 0; } -#else /* SUNOS_5 */ +# else /* SUNOS_5 */ if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave)) != sizeof (load_ave)) { kvm_close (kd); getloadavg_initialized = 0; } -#endif /* SUNOS_5 */ +# endif /* SUNOS_5 */ } if (offset == 0 || !getloadavg_initialized) return -1; -#endif /* LOAD_AVE_TYPE and not VMS */ +# endif /* LOAD_AVE_TYPE and not VMS */ -#if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS. */ +# if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS. */ if (nelem > 0) loadavg[elem++] = LDAV_CVT (load_ave[0]); if (nelem > 1) @@ -965,17 +995,17 @@ if (nelem > 2) loadavg[elem++] = LDAV_CVT (load_ave[2]); -#define LDAV_DONE -#endif /* !LDAV_DONE && LOAD_AVE_TYPE */ +# define LDAV_DONE +# endif /* !LDAV_DONE && LOAD_AVE_TYPE */ -#ifdef LDAV_DONE +# ifdef LDAV_DONE return elem; -#else +# else /* Set errno to zero to indicate that there was no particular error; this function just can't work at all on this system. */ errno = 0; return -1; -#endif +# endif } #endif /* ! HAVE_GETLOADAVG */