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