diff options
Diffstat (limited to 'gl/getloadavg.c')
| -rw-r--r-- | gl/getloadavg.c | 258 |
1 files changed, 128 insertions, 130 deletions
diff --git a/gl/getloadavg.c b/gl/getloadavg.c index 5a4005ce..c6d782b4 100644 --- a/gl/getloadavg.c +++ b/gl/getloadavg.c | |||
| @@ -1,8 +1,7 @@ | |||
| 1 | /* Get the system load averages. | 1 | /* Get the system load averages. |
| 2 | 2 | ||
| 3 | Copyright (C) 1985, 1986, 1987, 1988, 1989, 1991, 1992, 1993, 1994, | 3 | Copyright (C) 1985-1989, 1991-1995, 1997, 1999-2000, 2003-2010 Free Software |
| 4 | 1995, 1997, 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free | 4 | Foundation, Inc. |
| 5 | Software Foundation, Inc. | ||
| 6 | 5 | ||
| 7 | NOTE: The canonical source of this file is maintained with gnulib. | 6 | NOTE: The canonical source of this file is maintained with gnulib. |
| 8 | Bugs can be reported to bug-gnulib@gnu.org. | 7 | Bugs can be reported to bug-gnulib@gnu.org. |
| @@ -22,58 +21,58 @@ | |||
| 22 | 21 | ||
| 23 | /* Compile-time symbols that this file uses: | 22 | /* Compile-time symbols that this file uses: |
| 24 | 23 | ||
| 25 | HAVE_PSTAT_GETDYNAMIC Define this if your system has the | 24 | HAVE_PSTAT_GETDYNAMIC Define this if your system has the |
| 26 | pstat_getdynamic function. I think it | 25 | pstat_getdynamic function. I think it |
| 27 | is unique to HPUX9. The best way to get the | 26 | is unique to HPUX9. The best way to get the |
| 28 | definition is through the AC_FUNC_GETLOADAVG | 27 | definition is through the AC_FUNC_GETLOADAVG |
| 29 | macro that comes with autoconf 2.13 or newer. | 28 | macro that comes with autoconf 2.13 or newer. |
| 30 | If that isn't an option, then just put | 29 | If that isn't an option, then just put |
| 31 | AC_CHECK_FUNCS(pstat_getdynamic) in your | 30 | AC_CHECK_FUNCS(pstat_getdynamic) in your |
| 32 | configure.in file. | 31 | configure.in file. |
| 33 | HAVE_LIBPERFSTAT Define this if your system has the | 32 | HAVE_LIBPERFSTAT Define this if your system has the |
| 34 | perfstat_cpu_total function in libperfstat (AIX). | 33 | perfstat_cpu_total function in libperfstat (AIX). |
| 35 | FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist. | 34 | FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist. |
| 36 | KERNEL_FILE Name of the kernel file to nlist. | 35 | KERNEL_FILE Name of the kernel file to nlist. |
| 37 | LDAV_CVT() Scale the load average from the kernel. | 36 | LDAV_CVT() Scale the load average from the kernel. |
| 38 | Returns a double. | 37 | Returns a double. |
| 39 | LDAV_SYMBOL Name of kernel symbol giving load average. | 38 | LDAV_SYMBOL Name of kernel symbol giving load average. |
| 40 | LOAD_AVE_TYPE Type of the load average array in the kernel. | 39 | LOAD_AVE_TYPE Type of the load average array in the kernel. |
| 41 | Must be defined unless one of | 40 | Must be defined unless one of |
| 42 | apollo, DGUX, NeXT, or UMAX is defined; | 41 | apollo, DGUX, NeXT, or UMAX is defined; |
| 43 | or we have libkstat; | 42 | or we have libkstat; |
| 44 | otherwise, no load average is available. | 43 | otherwise, no load average is available. |
| 45 | HAVE_NLIST_H nlist.h is available. NLIST_STRUCT defaults | 44 | HAVE_NLIST_H nlist.h is available. NLIST_STRUCT defaults |
| 46 | to this. | 45 | to this. |
| 47 | NLIST_STRUCT Include nlist.h, not a.out.h, and | 46 | NLIST_STRUCT Include nlist.h, not a.out.h. |
| 48 | the nlist n_name element is a pointer, | 47 | N_NAME_POINTER The nlist n_name element is a pointer, |
| 49 | not an array. | 48 | not an array. |
| 50 | HAVE_STRUCT_NLIST_N_UN_N_NAME `n_un.n_name' is member of `struct nlist'. | 49 | HAVE_STRUCT_NLIST_N_UN_N_NAME `n_un.n_name' is member of `struct nlist'. |
| 51 | LINUX_LDAV_FILE [__linux__, __CYGWIN__]: File containing | 50 | LINUX_LDAV_FILE [__linux__, __CYGWIN__]: File containing |
| 52 | load averages. | 51 | load averages. |
| 53 | 52 | ||
| 54 | Specific system predefines this file uses, aside from setting | 53 | Specific system predefines this file uses, aside from setting |
| 55 | default values if not emacs: | 54 | default values if not emacs: |
| 56 | 55 | ||
| 57 | apollo | 56 | apollo |
| 58 | BSD Real BSD, not just BSD-like. | 57 | BSD Real BSD, not just BSD-like. |
| 59 | convex | 58 | convex |
| 60 | DGUX | 59 | DGUX |
| 61 | eunice UNIX emulator under VMS. | 60 | eunice UNIX emulator under VMS. |
| 62 | hpux | 61 | hpux |
| 63 | __MSDOS__ No-op for MSDOS. | 62 | __MSDOS__ No-op for MSDOS. |
| 64 | NeXT | 63 | NeXT |
| 65 | sgi | 64 | sgi |
| 66 | sequent Sequent Dynix 3.x.x (BSD) | 65 | sequent Sequent Dynix 3.x.x (BSD) |
| 67 | _SEQUENT_ Sequent DYNIX/ptx 1.x.x (SYSV) | 66 | _SEQUENT_ Sequent DYNIX/ptx 1.x.x (SYSV) |
| 68 | sony_news NEWS-OS (works at least for 4.1C) | 67 | sony_news NEWS-OS (works at least for 4.1C) |
| 69 | UMAX | 68 | UMAX |
| 70 | UMAX4_3 | 69 | UMAX4_3 |
| 71 | VMS | 70 | VMS |
| 72 | WINDOWS32 No-op for Windows95/NT. | 71 | WINDOWS32 No-op for Windows95/NT. |
| 73 | __linux__ Linux: assumes /proc file system mounted. | 72 | __linux__ Linux: assumes /proc file system mounted. |
| 74 | Support from Michael K. Johnson. | 73 | Support from Michael K. Johnson. |
| 75 | __CYGWIN__ Cygwin emulates linux /proc/loadavg. | 74 | __CYGWIN__ Cygwin emulates linux /proc/loadavg. |
| 76 | __NetBSD__ NetBSD: assumes /kern file system mounted. | 75 | __NetBSD__ NetBSD: assumes /kern file system mounted. |
| 77 | 76 | ||
| 78 | In addition, to avoid nesting many #ifdefs, we internally set | 77 | In addition, to avoid nesting many #ifdefs, we internally set |
| 79 | LDAV_DONE to indicate that the load average has been computed. | 78 | LDAV_DONE to indicate that the load average has been computed. |
| @@ -112,7 +111,6 @@ | |||
| 112 | # include "c-strtod.h" | 111 | # include "c-strtod.h" |
| 113 | # include "cloexec.h" | 112 | # include "cloexec.h" |
| 114 | # include "intprops.h" | 113 | # include "intprops.h" |
| 115 | # include "xalloc.h" | ||
| 116 | 114 | ||
| 117 | /* The existing Emacs configuration files define a macro called | 115 | /* The existing Emacs configuration files define a macro called |
| 118 | LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and | 116 | LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and |
| @@ -203,7 +201,7 @@ | |||
| 203 | default, but _MACH_IND_SYS_TYPES is defined in <sys/types.h>. Combine | 201 | default, but _MACH_IND_SYS_TYPES is defined in <sys/types.h>. Combine |
| 204 | that with a couple of other things and we'll have a unique match. */ | 202 | that with a couple of other things and we'll have a unique match. */ |
| 205 | # if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES) | 203 | # if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES) |
| 206 | # define tek4300 /* Define by emacs, but not by other users. */ | 204 | # define tek4300 /* Define by emacs, but not by other users. */ |
| 207 | # endif | 205 | # endif |
| 208 | 206 | ||
| 209 | 207 | ||
| @@ -317,7 +315,7 @@ | |||
| 317 | # define FSCALE 65536.0 | 315 | # define FSCALE 65536.0 |
| 318 | # endif | 316 | # endif |
| 319 | 317 | ||
| 320 | # endif /* Not FSCALE. */ | 318 | # endif /* Not FSCALE. */ |
| 321 | 319 | ||
| 322 | # if !defined (LDAV_CVT) && defined (FSCALE) | 320 | # if !defined (LDAV_CVT) && defined (FSCALE) |
| 323 | # define LDAV_CVT(n) (((double) (n)) / FSCALE) | 321 | # define LDAV_CVT(n) (((double) (n)) / FSCALE) |
| @@ -478,7 +476,7 @@ static unsigned int samples; | |||
| 478 | # endif /* UMAX */ | 476 | # endif /* UMAX */ |
| 479 | 477 | ||
| 480 | # ifdef DGUX | 478 | # ifdef DGUX |
| 481 | static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */ | 479 | static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */ |
| 482 | # endif /* DGUX */ | 480 | # endif /* DGUX */ |
| 483 | 481 | ||
| 484 | # if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE) | 482 | # if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE) |
| @@ -507,7 +505,7 @@ static kvm_t *kd; | |||
| 507 | int | 505 | int |
| 508 | getloadavg (double loadavg[], int nelem) | 506 | getloadavg (double loadavg[], int nelem) |
| 509 | { | 507 | { |
| 510 | int elem = 0; /* Return value. */ | 508 | int elem = 0; /* Return value. */ |
| 511 | 509 | ||
| 512 | # ifdef NO_GET_LOAD_AVG | 510 | # ifdef NO_GET_LOAD_AVG |
| 513 | # define LDAV_DONE | 511 | # define LDAV_DONE |
| @@ -549,16 +547,16 @@ getloadavg (double loadavg[], int nelem) | |||
| 549 | { | 547 | { |
| 550 | kn = kstat_data_lookup (ksp, "avenrun_5min"); | 548 | kn = kstat_data_lookup (ksp, "avenrun_5min"); |
| 551 | if (kn != 0) | 549 | if (kn != 0) |
| 552 | { | 550 | { |
| 553 | loadavg[elem++] = (double) kn->value.ul / FSCALE; | 551 | loadavg[elem++] = (double) kn->value.ul / FSCALE; |
| 554 | 552 | ||
| 555 | if (nelem >= 3) | 553 | if (nelem >= 3) |
| 556 | { | 554 | { |
| 557 | kn = kstat_data_lookup (ksp, "avenrun_15min"); | 555 | kn = kstat_data_lookup (ksp, "avenrun_15min"); |
| 558 | if (kn != 0) | 556 | if (kn != 0) |
| 559 | loadavg[elem++] = (double) kn->value.ul / FSCALE; | 557 | loadavg[elem++] = (double) kn->value.ul / FSCALE; |
| 560 | } | 558 | } |
| 561 | } | 559 | } |
| 562 | } | 560 | } |
| 563 | 561 | ||
| 564 | kstat_close (kc); | 562 | kstat_close (kc); |
| @@ -626,11 +624,11 @@ getloadavg (double loadavg[], int nelem) | |||
| 626 | errno = 0; | 624 | errno = 0; |
| 627 | d = c_strtod (ptr, &endptr); | 625 | d = c_strtod (ptr, &endptr); |
| 628 | if (ptr == endptr || (d == 0 && errno != 0)) | 626 | if (ptr == endptr || (d == 0 && errno != 0)) |
| 629 | { | 627 | { |
| 630 | if (elem == 0) | 628 | if (elem == 0) |
| 631 | return -1; | 629 | return -1; |
| 632 | break; | 630 | break; |
| 633 | } | 631 | } |
| 634 | loadavg[elem] = d; | 632 | loadavg[elem] = d; |
| 635 | ptr = endptr; | 633 | ptr = endptr; |
| 636 | } | 634 | } |
| @@ -655,8 +653,8 @@ getloadavg (double loadavg[], int nelem) | |||
| 655 | if (fp == NULL) | 653 | if (fp == NULL) |
| 656 | return -1; | 654 | return -1; |
| 657 | count = fscanf (fp, "%lu %lu %lu %lu\n", | 655 | count = fscanf (fp, "%lu %lu %lu %lu\n", |
| 658 | &load_ave[0], &load_ave[1], &load_ave[2], | 656 | &load_ave[0], &load_ave[1], &load_ave[2], |
| 659 | &scale); | 657 | &scale); |
| 660 | (void) fclose (fp); | 658 | (void) fclose (fp); |
| 661 | if (count != 4) | 659 | if (count != 4) |
| 662 | return -1; | 660 | return -1; |
| @@ -682,21 +680,21 @@ getloadavg (double loadavg[], int nelem) | |||
| 682 | if (!getloadavg_initialized) | 680 | if (!getloadavg_initialized) |
| 683 | { | 681 | { |
| 684 | if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS) | 682 | if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS) |
| 685 | getloadavg_initialized = true; | 683 | getloadavg_initialized = true; |
| 686 | } | 684 | } |
| 687 | 685 | ||
| 688 | if (getloadavg_initialized) | 686 | if (getloadavg_initialized) |
| 689 | { | 687 | { |
| 690 | info_count = PROCESSOR_SET_BASIC_INFO_COUNT; | 688 | info_count = PROCESSOR_SET_BASIC_INFO_COUNT; |
| 691 | if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host, | 689 | if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host, |
| 692 | (processor_set_info_t) &info, &info_count) | 690 | (processor_set_info_t) &info, &info_count) |
| 693 | != KERN_SUCCESS) | 691 | != KERN_SUCCESS) |
| 694 | getloadavg_initialized = false; | 692 | getloadavg_initialized = false; |
| 695 | else | 693 | else |
| 696 | { | 694 | { |
| 697 | if (nelem > 0) | 695 | if (nelem > 0) |
| 698 | loadavg[elem++] = (double) info.load_average / LOAD_SCALE; | 696 | loadavg[elem++] = (double) info.load_average / LOAD_SCALE; |
| 699 | } | 697 | } |
| 700 | } | 698 | } |
| 701 | 699 | ||
| 702 | if (!getloadavg_initialized) | 700 | if (!getloadavg_initialized) |
| @@ -728,24 +726,24 @@ getloadavg (double loadavg[], int nelem) | |||
| 728 | desc.sd_size = sizeof conf; | 726 | desc.sd_size = sizeof conf; |
| 729 | 727 | ||
| 730 | if (inq_stats (1, &desc)) | 728 | if (inq_stats (1, &desc)) |
| 731 | return -1; | 729 | return -1; |
| 732 | 730 | ||
| 733 | c = 0; | 731 | c = 0; |
| 734 | for (i = 0; i < conf.config_maxclass; ++i) | 732 | for (i = 0; i < conf.config_maxclass; ++i) |
| 735 | { | 733 | { |
| 736 | struct class_stats stats; | 734 | struct class_stats stats; |
| 737 | bzero ((char *) &stats, sizeof stats); | 735 | bzero ((char *) &stats, sizeof stats); |
| 738 | 736 | ||
| 739 | desc.sd_type = CPUTYPE_CLASS; | 737 | desc.sd_type = CPUTYPE_CLASS; |
| 740 | desc.sd_objid = i; | 738 | desc.sd_objid = i; |
| 741 | desc.sd_addr = (char *) &stats; | 739 | desc.sd_addr = (char *) &stats; |
| 742 | desc.sd_size = sizeof stats; | 740 | desc.sd_size = sizeof stats; |
| 743 | 741 | ||
| 744 | if (inq_stats (1, &desc)) | 742 | if (inq_stats (1, &desc)) |
| 745 | return -1; | 743 | return -1; |
| 746 | 744 | ||
| 747 | c += stats.class_numcpus; | 745 | c += stats.class_numcpus; |
| 748 | } | 746 | } |
| 749 | cpus = c; | 747 | cpus = c; |
| 750 | samples = cpus < 2 ? 3 : (2 * cpus / 3); | 748 | samples = cpus < 2 ? 3 : (2 * cpus / 3); |
| 751 | } | 749 | } |
| @@ -766,7 +764,7 @@ getloadavg (double loadavg[], int nelem) | |||
| 766 | { | 764 | { |
| 767 | load += proc_sum_data.ps_nrun[j]; | 765 | load += proc_sum_data.ps_nrun[j]; |
| 768 | if (j++ == PS_NRUNSIZE) | 766 | if (j++ == PS_NRUNSIZE) |
| 769 | j = 0; | 767 | j = 0; |
| 770 | } | 768 | } |
| 771 | 769 | ||
| 772 | if (nelem > 0) | 770 | if (nelem > 0) |
| @@ -779,8 +777,8 @@ getloadavg (double loadavg[], int nelem) | |||
| 779 | it's not supposed to fail. The first argument is for no | 777 | it's not supposed to fail. The first argument is for no |
| 780 | apparent reason of type `long int *'. */ | 778 | apparent reason of type `long int *'. */ |
| 781 | dg_sys_info ((long int *) &load_info, | 779 | dg_sys_info ((long int *) &load_info, |
| 782 | DG_SYS_INFO_LOAD_INFO_TYPE, | 780 | DG_SYS_INFO_LOAD_INFO_TYPE, |
| 783 | DG_SYS_INFO_LOAD_VERSION_0); | 781 | DG_SYS_INFO_LOAD_VERSION_0); |
| 784 | 782 | ||
| 785 | if (nelem > 0) | 783 | if (nelem > 0) |
| 786 | loadavg[elem++] = load_info.one_minute; | 784 | loadavg[elem++] = load_info.one_minute; |
| @@ -824,7 +822,7 @@ getloadavg (double loadavg[], int nelem) | |||
| 824 | = (load_ave.tl_lscale == 0 | 822 | = (load_ave.tl_lscale == 0 |
| 825 | ? load_ave.tl_avenrun.d[0] | 823 | ? load_ave.tl_avenrun.d[0] |
| 826 | : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale)); | 824 | : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale)); |
| 827 | # endif /* OSF_MIPS */ | 825 | # endif /* OSF_MIPS */ |
| 828 | 826 | ||
| 829 | # if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32)) | 827 | # if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32)) |
| 830 | # define LDAV_DONE | 828 | # define LDAV_DONE |
| @@ -844,8 +842,8 @@ getloadavg (double loadavg[], int nelem) | |||
| 844 | for (elem = 0; elem < nelem; elem++) | 842 | for (elem = 0; elem < nelem; elem++) |
| 845 | loadavg[elem] | 843 | loadavg[elem] |
| 846 | = (load_ave.tl_lscale == 0 | 844 | = (load_ave.tl_lscale == 0 |
| 847 | ? load_ave.tl_avenrun.d[elem] | 845 | ? load_ave.tl_avenrun.d[elem] |
| 848 | : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale)); | 846 | : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale)); |
| 849 | # endif /* OSF_ALPHA */ | 847 | # endif /* OSF_ALPHA */ |
| 850 | 848 | ||
| 851 | # if ! defined LDAV_DONE && defined __VMS | 849 | # if ! defined LDAV_DONE && defined __VMS |
| @@ -872,13 +870,13 @@ getloadavg (double loadavg[], int nelem) | |||
| 872 | $DESCRIPTOR (descriptor, "LAV0:"); | 870 | $DESCRIPTOR (descriptor, "LAV0:"); |
| 873 | # endif | 871 | # endif |
| 874 | if (sys$assign (&descriptor, &channel, 0, 0) & 1) | 872 | if (sys$assign (&descriptor, &channel, 0, 0) & 1) |
| 875 | getloadavg_initialized = true; | 873 | getloadavg_initialized = true; |
| 876 | } | 874 | } |
| 877 | 875 | ||
| 878 | /* Read the load average vector. */ | 876 | /* Read the load average vector. */ |
| 879 | if (getloadavg_initialized | 877 | if (getloadavg_initialized |
| 880 | && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0, | 878 | && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0, |
| 881 | load_ave, 12, 0, 0, 0, 0) & 1)) | 879 | load_ave, 12, 0, 0, 0, 0) & 1)) |
| 882 | { | 880 | { |
| 883 | sys$dassgn (channel); | 881 | sys$dassgn (channel); |
| 884 | getloadavg_initialized = false; | 882 | getloadavg_initialized = false; |
| @@ -892,7 +890,7 @@ getloadavg (double loadavg[], int nelem) | |||
| 892 | 890 | ||
| 893 | /* UNIX-specific code -- read the average from /dev/kmem. */ | 891 | /* UNIX-specific code -- read the average from /dev/kmem. */ |
| 894 | 892 | ||
| 895 | # define LDAV_PRIVILEGED /* This code requires special installation. */ | 893 | # define LDAV_PRIVILEGED /* This code requires special installation. */ |
| 896 | 894 | ||
| 897 | LOAD_AVE_TYPE load_ave[3]; | 895 | LOAD_AVE_TYPE load_ave[3]; |
| 898 | 896 | ||
| @@ -900,7 +898,7 @@ getloadavg (double loadavg[], int nelem) | |||
| 900 | if (offset == 0) | 898 | if (offset == 0) |
| 901 | { | 899 | { |
| 902 | # ifndef sgi | 900 | # ifndef sgi |
| 903 | # ifndef NLIST_STRUCT | 901 | # if ! defined NLIST_STRUCT || ! defined N_NAME_POINTER |
| 904 | strcpy (nl[0].n_name, LDAV_SYMBOL); | 902 | strcpy (nl[0].n_name, LDAV_SYMBOL); |
| 905 | strcpy (nl[1].n_name, ""); | 903 | strcpy (nl[1].n_name, ""); |
| 906 | # else /* NLIST_STRUCT */ | 904 | # else /* NLIST_STRUCT */ |
| @@ -916,25 +914,25 @@ getloadavg (double loadavg[], int nelem) | |||
| 916 | # ifndef SUNOS_5 | 914 | # ifndef SUNOS_5 |
| 917 | if ( | 915 | if ( |
| 918 | # if !(defined (_AIX) && !defined (ps2)) | 916 | # if !(defined (_AIX) && !defined (ps2)) |
| 919 | nlist (KERNEL_FILE, nl) | 917 | nlist (KERNEL_FILE, nl) |
| 920 | # else /* _AIX */ | 918 | # else /* _AIX */ |
| 921 | knlist (nl, 1, sizeof (nl[0])) | 919 | knlist (nl, 1, sizeof (nl[0])) |
| 922 | # endif | 920 | # endif |
| 923 | >= 0) | 921 | >= 0) |
| 924 | /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */ | 922 | /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */ |
| 925 | { | 923 | { |
| 926 | # ifdef FIXUP_KERNEL_SYMBOL_ADDR | 924 | # ifdef FIXUP_KERNEL_SYMBOL_ADDR |
| 927 | FIXUP_KERNEL_SYMBOL_ADDR (nl); | 925 | FIXUP_KERNEL_SYMBOL_ADDR (nl); |
| 928 | # endif | 926 | # endif |
| 929 | offset = nl[0].n_value; | 927 | offset = nl[0].n_value; |
| 930 | } | 928 | } |
| 931 | # endif /* !SUNOS_5 */ | 929 | # endif /* !SUNOS_5 */ |
| 932 | # else /* sgi */ | 930 | # else /* sgi */ |
| 933 | int ldav_off; | 931 | int ldav_off; |
| 934 | 932 | ||
| 935 | ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN); | 933 | ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN); |
| 936 | if (ldav_off != -1) | 934 | if (ldav_off != -1) |
| 937 | offset = (long int) ldav_off & 0x7fffffff; | 935 | offset = (long int) ldav_off & 0x7fffffff; |
| 938 | # endif /* sgi */ | 936 | # endif /* sgi */ |
| 939 | } | 937 | } |
| 940 | 938 | ||
| @@ -944,23 +942,23 @@ getloadavg (double loadavg[], int nelem) | |||
| 944 | # ifndef SUNOS_5 | 942 | # ifndef SUNOS_5 |
| 945 | channel = open ("/dev/kmem", O_RDONLY); | 943 | channel = open ("/dev/kmem", O_RDONLY); |
| 946 | if (channel >= 0) | 944 | if (channel >= 0) |
| 947 | { | 945 | { |
| 948 | /* Set the channel to close on exec, so it does not | 946 | /* Set the channel to close on exec, so it does not |
| 949 | litter any child's descriptor table. */ | 947 | litter any child's descriptor table. */ |
| 950 | set_cloexec_flag (channel, true); | 948 | set_cloexec_flag (channel, true); |
| 951 | getloadavg_initialized = true; | 949 | getloadavg_initialized = true; |
| 952 | } | 950 | } |
| 953 | # else /* SUNOS_5 */ | 951 | # else /* SUNOS_5 */ |
| 954 | /* We pass 0 for the kernel, corefile, and swapfile names | 952 | /* We pass 0 for the kernel, corefile, and swapfile names |
| 955 | to use the currently running kernel. */ | 953 | to use the currently running kernel. */ |
| 956 | kd = kvm_open (0, 0, 0, O_RDONLY, 0); | 954 | kd = kvm_open (0, 0, 0, O_RDONLY, 0); |
| 957 | if (kd != 0) | 955 | if (kd != 0) |
| 958 | { | 956 | { |
| 959 | /* nlist the currently running kernel. */ | 957 | /* nlist the currently running kernel. */ |
| 960 | kvm_nlist (kd, nl); | 958 | kvm_nlist (kd, nl); |
| 961 | offset = nl[0].n_value; | 959 | offset = nl[0].n_value; |
| 962 | getloadavg_initialized = true; | 960 | getloadavg_initialized = true; |
| 963 | } | 961 | } |
| 964 | # endif /* SUNOS_5 */ | 962 | # endif /* SUNOS_5 */ |
| 965 | } | 963 | } |
| 966 | 964 | ||
| @@ -970,19 +968,19 @@ getloadavg (double loadavg[], int nelem) | |||
| 970 | /* Try to read the load. */ | 968 | /* Try to read the load. */ |
| 971 | # ifndef SUNOS_5 | 969 | # ifndef SUNOS_5 |
| 972 | if (lseek (channel, offset, 0) == -1L | 970 | if (lseek (channel, offset, 0) == -1L |
| 973 | || read (channel, (char *) load_ave, sizeof (load_ave)) | 971 | || read (channel, (char *) load_ave, sizeof (load_ave)) |
| 974 | != sizeof (load_ave)) | 972 | != sizeof (load_ave)) |
| 975 | { | 973 | { |
| 976 | close (channel); | 974 | close (channel); |
| 977 | getloadavg_initialized = false; | 975 | getloadavg_initialized = false; |
| 978 | } | 976 | } |
| 979 | # else /* SUNOS_5 */ | 977 | # else /* SUNOS_5 */ |
| 980 | if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave)) | 978 | if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave)) |
| 981 | != sizeof (load_ave)) | 979 | != sizeof (load_ave)) |
| 982 | { | 980 | { |
| 983 | kvm_close (kd); | 981 | kvm_close (kd); |
| 984 | getloadavg_initialized = false; | 982 | getloadavg_initialized = false; |
| 985 | } | 983 | } |
| 986 | # endif /* SUNOS_5 */ | 984 | # endif /* SUNOS_5 */ |
| 987 | } | 985 | } |
| 988 | 986 | ||
| @@ -1026,24 +1024,24 @@ main (int argc, char **argv) | |||
| 1026 | double avg[3]; | 1024 | double avg[3]; |
| 1027 | int loads; | 1025 | int loads; |
| 1028 | 1026 | ||
| 1029 | errno = 0; /* Don't be misled if it doesn't set errno. */ | 1027 | errno = 0; /* Don't be misled if it doesn't set errno. */ |
| 1030 | loads = getloadavg (avg, 3); | 1028 | loads = getloadavg (avg, 3); |
| 1031 | if (loads == -1) | 1029 | if (loads == -1) |
| 1032 | { | 1030 | { |
| 1033 | perror ("Error getting load average"); | 1031 | perror ("Error getting load average"); |
| 1034 | return EXIT_FAILURE; | 1032 | return EXIT_FAILURE; |
| 1035 | } | 1033 | } |
| 1036 | if (loads > 0) | 1034 | if (loads > 0) |
| 1037 | printf ("1-minute: %f ", avg[0]); | 1035 | printf ("1-minute: %f ", avg[0]); |
| 1038 | if (loads > 1) | 1036 | if (loads > 1) |
| 1039 | printf ("5-minute: %f ", avg[1]); | 1037 | printf ("5-minute: %f ", avg[1]); |
| 1040 | if (loads > 2) | 1038 | if (loads > 2) |
| 1041 | printf ("15-minute: %f ", avg[2]); | 1039 | printf ("15-minute: %f ", avg[2]); |
| 1042 | if (loads > 0) | 1040 | if (loads > 0) |
| 1043 | putchar ('\n'); | 1041 | putchar ('\n'); |
| 1044 | 1042 | ||
| 1045 | if (naptime == 0) | 1043 | if (naptime == 0) |
| 1046 | break; | 1044 | break; |
| 1047 | sleep (naptime); | 1045 | sleep (naptime); |
| 1048 | } | 1046 | } |
| 1049 | 1047 | ||
