Mercurial > hg > xemacs-beta
diff src/getloadavg.c @ 5494:861f2601a38b
Sync s/ files with GNU 23.1.92, delete obsolete stuff, simplify other stuff
--- ChangeLog
2010-02-20 Ben Wing <ben@xemacs.org>
* configure:
* configure.ac (XE_EXPAND_VARIABLE):
* configure.ac (TAB):
irix6-0.h renamed to irix6-5.h; sco7.h deleted.
bsd4-3.h renamed to bsd-common.h.
Simplify setting machine= for intel386, mips.
Put back linux.h.
Incorporate some stuff about debug/optimization flags in irix6-5.h
into configure.ac.
Add a comment about LCC stuff with optimization flags that should be
fixed up.
--- src/ChangeLog
2010-02-20 Ben Wing <ben@xemacs.org>
* sysdep.c:
* sysdep.c (qxe_reliable_signal):
* sysdep.c (retry_open_1):
* sysdep.c (retry_close):
* sysdep.c (retry_read_1):
* sysdep.c (retry_write_1):
* sysdep.c (retry_fopen):
* sysdep.c (retry_fclose):
* sysdep.c (retry_fread):
* sysdep.c (retry_fwrite):
Remove conditionalization on INTERRUPTIBLE_IO, INTERRUPTIBLE_OPEN,
INTERRUPTIBLE_CLOSE -- always check for EINTR as there's no harm
in it.
Remove old #if 0'ed out SA_RESTART code.
Use manifest constant IRIX6_5 instead of IRIX.
* Makefile.in.in:
* dired.c:
* dired.c (Ffile_attributes):
Use manifest constant IRIX6_5 instead of IRIX.
Eliminate constant BSD4_2, use BSD4_3 instead.
* getloadavg.c:
* getloadavg.c (getloadavg):
* getloadavg.c (LDAV_PRIVILEGED):
* getloadavg.c (LDAV_DONE):
Sync with GNU 23.1.92.
2010-02-20 Ben Wing <ben@xemacs.org>
* s/README:
* s/aix4-2.h:
* s/aix4-2.h (MAIL_USE_LOCKF):
* s/bsd-common.h:
* s/freebsd.h:
* s/freebsd.h (Carey):
* s/freebsd.h (or):
* s/gnu.h:
* s/gnu.h (DATA_START):
* s/hpux11-shr.h:
* s/hpux11.h:
* s/hpux11.h (random):
* s/irix6-5.h:
* s/linux.h:
* s/mach-bsd4-3.h:
* s/netbsd.h:
* s/netbsd.h (or):
* s/netbsd.h (A_TEXT_OFFSET):
* s/netbsd.h (NO_MATHERR):
* s/openbsd.h:
* s/sol2.h:
* s/usg5-4-2.h:
* s/usg5-4.h:
* s/usg5-4.h (or):
* s/usg5-4.h (ORDINARY_LINK):
Sync with GNU 23.1.92.
Put back linux.h.
Rename: bsd4-3.h -> bsd-common.h; irix6-0.h -> irix6-5.h.
Delete: template.h (useless).
Delete a whole bunch of obsolete stuff in sol2.h, linux.h,
freebsd.h -- assume anything over 10 years old is sufficiently
obsolete to be deleted.
Remove LIBS_DEBUG, C_DEBUG_SWITCH, C_OPTIMIZE_SWITCH, KERNEL_FILE,
LDAV_SYMBOL, most remaining PTY stuff, remaining TERMINFO/TERMCAP
stuff. Update README appropriately.
Remove stuff in hpux11-shr.h duplicated in hpux11.h.
Remove sco7.h, identical with usg5-4-2.h.
Remove unused POSIX flag, BROKEN_TIOC*, NO_SIOCTL_H.
2010-02-20 Ben Wing <ben@xemacs.org>
* m/arm.h:
* m/hp800.h:
* m/intel386.h:
* m/mips.h:
* m/powerpc.h:
* m/sparc.h:
* m/template.h:
Temporarily ifdef out all defines involving load-average stuff --
using define ENABLE_SM_FILE_DECLS_OF_LOADAVG_STUFF, which is not
defined.
I'm pretty sure getloadavg.c will take care of defining stuff
properly on all systems without the need to duplicate the info
in m/*. --ben
Delete LIBS_TERMCAP; configure auto-handles this.
Delete extra stuff in hp800.h.
Delete C_DEBUG_SWITCH, C_OPTIMIZE_SWITCH, LDAV_SYMBOL; incorporate
some stuff into configure.ac.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Sat, 20 Feb 2010 06:03:00 -0600 |
parents | aa5ed11f473b |
children | 1f0b15040456 |
line wrap: on
line diff
--- a/src/getloadavg.c Fri Feb 19 22:41:03 2010 -0600 +++ b/src/getloadavg.c Sat Feb 20 06:03:00 2010 -0600 @@ -1,6 +1,10 @@ /* Get the system load averages. - Copyright (C) 1985, 86, 87, 88, 89, 91, 92, 93, 1994, 1995 - Free Software Foundation, Inc. + Copyright (C) 1985-1989, 1991-1995, 1997, 2001-2008 + Free Software Foundation, Inc. + Copyright (C) 2010 Ben Wing. + + NOTE: The canonical source of this file is maintained with gnulib. + Bugs can be reported to bug-gnulib@gnu.org. This file is part of XEmacs. @@ -19,20 +23,38 @@ the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* Synced up with: FSF 23.1.92. */ +/* Synced by: Ben Wing. */ + /* Compile-time symbols that this file uses: + HAVE_SYS_PSTAT_H Defined if the pstat() function is available + (HPUX only); the GNU version uses + pstat_getdynamic() and HAVE_PSTAT_GETDYNAMIC. + + [[ GNU says: The best way to get the + definition is through the AC_FUNC_GETLOADAVG + macro that comes with autoconf 2.13 or newer. + If that isn't an option, then just put + AC_CHECK_FUNCS(pstat_getdynamic) in your + configure.in file. ]] But we don't do this, + apparently we do the equivalent of + AC_FUNC_GETLOADAVG dynamically. + FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist. KERNEL_FILE Pathname of the kernel to nlist. LDAV_CVT() Scale the load average from the kernel. Returns a double. LDAV_SYMBOL Name of kernel symbol giving load average. LOAD_AVE_TYPE Type of the load average array in the kernel. - Must be defined; otherwise, no load average - is available. + Must be defined; or we have libkstat; + otherwise, no load average is available. NLIST_STRUCT Include nlist.h, not a.out.h, and the nlist n_name element is a pointer, not an array. LINUX_LDAV_FILE [__linux__]: File containing load averages. + HAVE_LOCALE_H locale.h is available. + HAVE_SETLOCALE The `setlocale' function is available. Specific system predefines this file uses, aside from setting default values if not emacs: @@ -55,12 +77,19 @@ /* This should always be first. */ #ifdef HAVE_CONFIG_H -#include <config.h> +# include <config.h> #endif #include "lisp.h" #include "sysfile.h" /* for encapsulated open, close, read, write */ +#ifdef HAVE_LOCALE_H +# include <locale.h> +#endif +#ifndef HAVE_SETLOCALE +# define setlocale(Category, Locale) /* empty */ +#endif + #ifndef HAVE_GETLOADAVG /* The existing Emacs configuration files define a macro called @@ -73,248 +102,253 @@ 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 (HAVE_KSTAT_H) #include <kstat.h> #endif /* HAVE_KSTAT_H */ +/* Same issues as for NeXT apply to the HURD-based GNU system. */ +# ifdef __GNU__ +# undef BSD +# undef FSCALE +# endif /* __GNU__ */ + /* Set values that are different from the defaults, which are set a little farther down with #ifndef. */ /* 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(sun) && defined(SVR4)) || defined (SOLARIS2) -#define SUNOS_5 -#endif +# if defined (__sun) && !defined (sun) +# define sun +# endif + +# if defined (__SVR4) && !defined (SVR4) +# define SVR4 +# endif -#if defined (__osf__) && (defined (__alpha) || defined (__alpha__)) -#define OSF_ALPHA -#include <netdb.h> -#include <netinet/in.h> /* Needed for Digital UNIX V3 */ -#include <net/proto_net.h> -#include <sys/table.h> -#endif +# if (defined(sun) && defined(SVR4)) || defined (SOLARIS2) +# define SUNOS_5 +# endif + +# if defined (__osf__) && (defined (__alpha) || defined (__alpha__)) +# define OSF_ALPHA +# /* XEmacs: First three below from FSF 23.1.92. */ +# include <sys/mbuf.h> +# include <sys/socket.h> +# include <net/route.h> +# include <netdb.h> +# include <netinet/in.h> /* Needed for Digital UNIX V3 */ +# include <net/proto_net.h> +# include <sys/table.h> +# endif #if defined (__osf__) && (defined (mips) || defined (__mips__)) -#define OSF_MIPS -#include <sys/table.h> +# define OSF_MIPS +# include <sys/table.h> #endif /* VAX C can't handle multi-line #ifs, or lines longer than 256 chars. */ -#ifndef LOAD_AVE_TYPE +# ifndef LOAD_AVE_TYPE -#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 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 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 _AIX -#define LOAD_AVE_TYPE long -#endif +# ifdef _AIX +# define LOAD_AVE_TYPE long +# 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 -#ifndef FSCALE +# ifndef FSCALE /* SunOS and some others define FSCALE in sys/param.h. */ -#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) +# if defined (sgi) /* 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 - -#if defined (ardent) && defined (titan) -#define FSCALE 65536.0 -#endif +# undef FSCALE +# define FSCALE 1000.0 +# endif -#ifdef _AIX -#define FSCALE 65536.0 -#endif +# if defined (ardent) && defined (titan) +# define FSCALE 65536.0 +# endif -#endif /* Not FSCALE. */ - -#if !defined (LDAV_CVT) && defined (FSCALE) -#define LDAV_CVT(n) (((double) (n)) / FSCALE) -#endif +# ifdef _AIX +# define FSCALE 65536.0 +# endif -/* VAX C can't handle multi-line #ifs, or lines longer that 256 characters. */ -#ifndef NLIST_STRUCT +# endif /* Not FSCALE. */ -#ifdef sun -#define NLIST_STRUCT -#endif +# if !defined (LDAV_CVT) && defined (FSCALE) +# define LDAV_CVT(n) (((double) (n)) / FSCALE) +# endif -#ifdef decstation -#define NLIST_STRUCT -#endif - -#ifdef hpux -#define NLIST_STRUCT -#endif - -#ifdef sgi -#define NLIST_STRUCT +#if 0 /* XEmacs change ... we check for nlist.h during configure and + automatically set NLIST_STRUCT if so; we have no HAVE_NLIST_H. */ +# ifndef NLIST_STRUCT +# if HAVE_NLIST_H +# define NLIST_STRUCT +# endif +# endif #endif -#ifdef SVR4 -#define NLIST_STRUCT -#endif - -#ifdef sony_news -#define NLIST_STRUCT -#endif - -#ifdef OSF_ALPHA -#define NLIST_STRUCT -#endif +# if defined(sgi) || (defined(mips) && !defined(BSD)) +# define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31)) +# endif -#if defined (ardent) && defined (titan) -#define NLIST_STRUCT -#endif - -#ifdef butterfly -#define NLIST_STRUCT -#endif - -#ifdef _AIX -#define NLIST_STRUCT -#endif +# if !defined (KERNEL_FILE) && defined (hpux) +# define KERNEL_FILE "/hp-ux" +# endif -#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 (KERNEL_FILE) && defined (hpux) -#define KERNEL_FILE "/hp-ux" -#endif +# if !defined(KERNEL_FILE) && (defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || (defined (ardent) && defined (titan))) +# define KERNEL_FILE "/unix" +# endif -#if !defined(KERNEL_FILE) && (defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || defined(SVR4) || (defined (ardent) && defined (titan))) -#define KERNEL_FILE "/unix" -#endif +# if !defined(LDAV_SYMBOL) && (defined(hpux) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX)) +# define LDAV_SYMBOL "avenrun" +# endif -#if !defined(LDAV_SYMBOL) && (defined(hpux) || 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 __linux__ +# ifndef NLIST_STRUCT +# include <a.out.h> +# else /* NLIST_STRUCT */ +# include <nlist.h> +# endif /* NLIST_STRUCT */ -#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> -#endif + /* XEmacs: GNU says: defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) */ +# if defined (HAVE_SYS_PSTAT_H) +# include <sys/pstat.h> +# endif /* HAVE_SYS_PSTAT_H (on HPUX) */ + +# ifndef KERNEL_FILE +# define KERNEL_FILE "/vmunix" +# endif /* KERNEL_FILE */ -#ifndef KERNEL_FILE -#define KERNEL_FILE "/vmunix" -#endif /* KERNEL_FILE */ +# ifndef LDAV_SYMBOL +# define LDAV_SYMBOL "_avenrun" +# endif /* LDAV_SYMBOL */ +# endif /* __linux__ */ -#ifndef LDAV_SYMBOL -#define LDAV_SYMBOL "_avenrun" -#endif /* LDAV_SYMBOL */ +# ifndef LDAV_CVT +# define LDAV_CVT(n) ((double) (n)) +# endif /* !LDAV_CVT */ + +# endif /* LOAD_AVE_TYPE */ -#ifndef LDAV_CVT -#define LDAV_CVT(n) ((double) (n)) -#endif /* !LDAV_CVT */ - -#endif /* LOAD_AVE_TYPE */ +# if defined(__GNU__) && !defined (NeXT) +/* XEmacs -- FSF added code for the HURD, which depends on some NeXT + code that we deleted as outdated. We hardly care about compiling + on the HURD, but I'm leaving this stuff here just in case; if someone + wants to get this working, figure out which NeXT code needs to be + restored. */ +# error "Code not working currently" +/* Note that NeXT Openstep defines __GNU__ even though it should not. */ +/* GNU system acts much like NeXT, for load average purposes, + but not exactly. */ +# define NeXT +# define host_self mach_host_self +# endif /* defined(__GNU__) && !defined (NeXT) */ -#ifdef sgi -#include <sys/sysmp.h> -#endif /* sgi */ +/* (ifdef NeXT ... deleted) */ -#if defined (HAVE_SYS_PSTAT_H) -#include <sys/pstat.h> -#endif /* HAVE_SYS_PSTAT_H (on HPUX) */ +# ifdef sgi +# include <sys/sysmp.h> +# endif /* sgi */ /* Avoid static vars inside a function since in HPUX they dump as pure. */ -#ifdef LOAD_AVE_TYPE -/* File descriptor open to /dev/kmem */ +#if !defined(HAVE_LIBKSTAT) && defined(LOAD_AVE_TYPE) +/* File descriptor open to /dev/kmem or VMS load ave driver. */ static int channel; -/* Nonzero iff channel is valid. */ +/* Nonzero if channel is valid. */ static int getloadavg_initialized; /* Offset in kmem to seek to read load average, or 0 means invalid. */ static long offset; -#ifndef sgi -static struct nlist nl[2]; -#endif /* not sgi */ +# if !defined(sgi) && !defined(__linux__) +static struct nlist name_list[2]; +# endif /* Not Linux or sgi */ -#ifdef SUNOS_5 +# ifdef SUNOS_5 static kvm_t *kd; -#endif /* SUNOS_5 */ +# endif /* SUNOS_5 */ #ifndef countof # define countof(x) (sizeof (x) / sizeof (*(x))) #endif -#endif /* LOAD_AVE_TYPE */ +#endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT */ /* Put the 1 minute, 5 minute and 15 minute load averages into the first NELEM elements of LOADAVG. @@ -328,87 +362,97 @@ { 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 = -2; -#endif /* NO_GET_LOAD_AVG */ +# endif /* NO_GET_LOAD_AVG */ #if ! defined (LDAV_DONE) && defined (HAVE_KSTAT_H) && defined (HAVE_LIBKSTAT) -#define LDAV_DONE -/* getloadavg is best implemented using kstat (kernel stats), on - systems (like SunOS5) that support it, since you don't need special - privileges to use it. - - Initial implementation courtesy Zlatko Calusic <zcalusic@carnet.hr>. - Integrated to XEmacs by Hrvoje Niksic <hniksic@xemacs.org>. - Additional cleanup by Hrvoje Niksic, based on code published by - Casper Dik <Casper.Dik@Holland.Sun.Com>. */ +/* Use libkstat because we don't have to be root. */ +# define LDAV_DONE kstat_ctl_t *kc; kstat_t *ksp; - static char *avestrings[] = { "avenrun_1min", - "avenrun_5min", - "avenrun_15min" }; - - if (nelem > countof (avestrings)) - nelem = countof (avestrings); + kstat_named_t *kn; kc = kstat_open (); - if (!kc) + if (kc == 0) return -1; ksp = kstat_lookup (kc, "unix", 0, "system_misc"); - if (!ksp) + if (ksp == 0 ) + return -1; + if (kstat_read (kc, ksp, 0) == -1) + return -1; + + + kn = kstat_data_lookup (ksp, "avenrun_1min"); + if (kn == 0) { - kstat_close (kc); - return -1; + /* Return -1 if no load average information is available. */ + nelem = 0; + elem = -1; } - if (kstat_read (kc, ksp, 0) < 0) - { - kstat_close (kc); - return -1; - } - for (elem = 0; elem < nelem; elem++) + + if (nelem >= 1) + loadavg[elem++] = (double) kn->value.ul/FSCALE; + + if (nelem >= 2) { - kstat_named_t *kn = - (kstat_named_t *) kstat_data_lookup (ksp, avestrings[elem]); - if (!kn) + kn = kstat_data_lookup (ksp, "avenrun_5min"); + if (kn != 0) { - kstat_close (kc); - return -1; + loadavg[elem++] = (double) kn->value.ul/FSCALE; + + if (nelem >= 3) + { + kn = kstat_data_lookup (ksp, "avenrun_15min"); + if (kn != 0) + loadavg[elem++] = (double) kn->value.ul/FSCALE; + } } - loadavg[elem] = (double)kn->value.ul / FSCALE; } + kstat_close (kc); -#endif /* HAVE_KSTAT_H && HAVE_LIBKSTAT */ - -#if !defined (LDAV_DONE) && defined (HAVE_SYS_PSTAT_H) -#define LDAV_DONE +# endif /* HAVE_LIBKSTAT */ +# if !defined (LDAV_DONE) && defined (HAVE_SYS_PSTAT_H) + /* GNU says: .... && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) */ +# define LDAV_DONE /* This is totally undocumented, and is not guaranteed to work, but mayhap it might .... If it does work, it will work only on HP-UX 8.0 or later. -- Darryl Okahata <darrylo@sr.hp.com> */ -#undef LOAD_AVE_TYPE /* Make sure these don't exist. */ -#undef LOAD_AVE_CVT -#undef LDAV_SYMBOL - struct pst_dynamic procinfo; - union pstun statbuf; +# undef LOAD_AVE_TYPE +# undef LOAD_AVE_CVT +# undef LDAV_SYMBOL - statbuf.pst_dynamic = &procinfo; - if (pstat (PSTAT_DYNAMIC, statbuf, sizeof (struct pst_dynamic), 0, 0) == -1) - return (-1); - loadavg[elem++] = procinfo.psd_avg_1_min; - loadavg[elem++] = procinfo.psd_avg_5_min; - loadavg[elem++] = procinfo.psd_avg_15_min; -#endif /* HPUX */ + struct pst_dynamic dyn_info; +#if 0 /* GNU 23.1.92 */ + /* Use pstat_getdynamic() because we don't have to be root. */ + if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0) + return -1; +#else + union pstun statbuf; + statbuf.pst_dynamic = &dyn_info; + if (pstat (PSTAT_DYNAMIC, statbuf, sizeof (dyn_info), 0, 0) == -1) + return -1; +#endif + 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; -#if !defined (LDAV_DONE) && defined (__linux__) -#define LDAV_DONE -#undef LOAD_AVE_TYPE +# endif /* HAVE_SYS_PSTAT_H (GNU: hpux && HAVE_PSTAT_GETDYNAMIC) */ -#ifndef LINUX_LDAV_FILE -#define LINUX_LDAV_FILE "/proc/loadavg" -#endif +# 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]; @@ -422,22 +466,28 @@ if (count <= 0) return -1; + /* The following sscanf must use the C locale. */ + setlocale (LC_NUMERIC, "C"); count = sscanf (ldavgbuf, "%lf %lf %lf", &load_ave[0], &load_ave[1], &load_ave[2]); + setlocale (LC_NUMERIC, ""); if (count < 1) return -1; for (elem = 0; elem < nelem && elem < count; elem++) loadavg[elem] = load_ave[elem]; -#endif /* __linux__ */ + + return elem; + +# endif /* __linux__ */ -#if !defined (LDAV_DONE) && defined (__NetBSD__) || defined (__OpenBSD__) -#define LDAV_DONE -#undef LOAD_AVE_TYPE +# if !defined (LDAV_DONE) && (defined (__NetBSD__) || defined (__OpenBSD__)) +# 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; @@ -471,83 +521,84 @@ /* 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 - strcpy (nl[0].n_name, LDAV_SYMBOL); - strcpy (nl[1].n_name, ""); -#else /* NLIST_STRUCT */ - nl[0].n_name = (char *) LDAV_SYMBOL; - nl[1].n_name = 0; -#endif /* NLIST_STRUCT */ +# ifndef sgi +# ifndef NLIST_STRUCT + strcpy (name_list[0].n_name, LDAV_SYMBOL); + strcpy (name_list[1].n_name, ""); +# else /* NLIST_STRUCT */ + /* #### XEmacs deletes HAVE_STRUCT_NLIST_N_UN_N_NAME code. Why? */ + name_list[0].n_name = (char *) LDAV_SYMBOL; + name_list[1].n_name = 0; +# endif /* NLIST_STRUCT */ -#ifndef SUNOS_5 +# ifndef SUNOS_5 if ( -#if !(defined (_AIX) && !defined (ps2)) - nlist (KERNEL_FILE, nl) -#else /* _AIX */ - knlist (nl, 1, sizeof (nl[0])) -#endif +# if !(defined (_AIX) && !defined (ps2)) + nlist (KERNEL_FILE, name_list) +# else /* _AIX */ + knlist (name_list, 1, sizeof (name_list[0])) +# endif >= 0) - /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */ + /* Omit "&& name_list[0].n_type != 0 " -- it breaks on Sun386i. */ { -#ifdef FIXUP_KERNEL_SYMBOL_ADDR - FIXUP_KERNEL_SYMBOL_ADDR (nl); -#endif - offset = nl[0].n_value; +# ifdef FIXUP_KERNEL_SYMBOL_ADDR + FIXUP_KERNEL_SYMBOL_ADDR (name_list); +# endif + offset = name_list[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 = retry_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 F_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); if (kd != 0) { /* nlist the currently running kernel. */ - kvm_nlist (kd, nl); - offset = nl[0].n_value; + kvm_nlist (kd, name_list); + offset = name_list[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 || retry_read (channel, (char *) load_ave, sizeof (load_ave)) != sizeof (load_ave)) @@ -555,14 +606,14 @@ retry_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) @@ -575,8 +626,8 @@ 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 */ return elem; } @@ -621,3 +672,6 @@ exit (0); } #endif /* TEST */ + +/* arch-tag: 2b37a242-6289-41f4-8cd5-0e73fd615db1 + (do not change this comment) */