From da71a29a313e2177315635b779338e1f143b1617 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 21 Mar 2025 16:25:59 +0100 Subject: [PATCH] getloadavg: Improve Linux and Android support. * lib/getloadavg.c [__linux__, __ANDROID__]: Include and . (getloadavg) [__linux__, __ANDROID__]: Use sysinfo() instead of reading /proc/loadavg. (LINUX_LDAV_FILE): Remove macro. --- ChangeLog | 9 +++++++++ lib/getloadavg.c | 34 ++++++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 289a3e6cf9..e0a18ebd25 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2025-03-21 Bruno Haible + + getloadavg: Improve Linux and Android support. + * lib/getloadavg.c [__linux__, __ANDROID__]: Include and + . + (getloadavg) [__linux__, __ANDROID__]: Use sysinfo() instead of reading + /proc/loadavg. + (LINUX_LDAV_FILE): Remove macro. + 2025-03-21 Bruno Haible setlocale-null: Fix autoconf warning. diff --git a/lib/getloadavg.c b/lib/getloadavg.c index a7966462c7..628fecf21c 100644 --- a/lib/getloadavg.c +++ b/lib/getloadavg.c @@ -47,8 +47,6 @@ N_NAME_POINTER The nlist n_name element is a pointer, not an array. HAVE_STRUCT_NLIST_N_UN_N_NAME 'n_un.n_name' is member of 'struct nlist'. - LINUX_LDAV_FILE [__linux__, __ANDROID__, __CYGWIN__]: File - containing load averages. Specific system predefines this file uses, aside from setting default values if not emacs: @@ -65,8 +63,7 @@ UMAX4_3 VMS _WIN32 Native Windows (possibly also defined on Cygwin) - __linux__, __ANDROID__ Linux: assumes /proc file system mounted. - Support from Michael K. Johnson. + __linux__, __ANDROID__ Linux: assumes sysinfo() call. __CYGWIN__ Cygwin emulates linux /proc/loadavg. __NetBSD__ NetBSD: assumes /kern file system mounted. @@ -358,6 +355,11 @@ # include # endif +# if defined __linux__ || defined __ANDROID__ +# include +# include +# endif + # if (defined __linux__ || defined __ANDROID__ \ || defined __CYGWIN__ || defined SUNOS_5 \ || (defined LOAD_AVE_TYPE && ! defined __VMS)) @@ -498,20 +500,32 @@ getloadavg (double loadavg[], int nelem) } # endif -# if !defined (LDAV_DONE) && (defined __linux__ || defined __ANDROID__ || defined __CYGWIN__) +# if !defined (LDAV_DONE) && (defined __linux__ || defined __ANDROID__) /* Linux without glibc, Android, Cygwin */ # define LDAV_DONE # undef LOAD_AVE_TYPE -# ifndef LINUX_LDAV_FILE -# define LINUX_LDAV_FILE "/proc/loadavg" -# endif + { + struct sysinfo info; + if (sysinfo (&info) < 0) + return -1; + loadavg[0] = info.loads[0] / (double)(1U << SI_LOAD_SHIFT); + loadavg[1] = info.loads[1] / (double)(1U << SI_LOAD_SHIFT); + loadavg[2] = info.loads[2] / (double)(1U << SI_LOAD_SHIFT); + elem = 3; + } +# endif /* __linux__ || __ANDROID__ */ + +# if !defined (LDAV_DONE) && defined __CYGWIN__ + /* Cygwin */ +# define LDAV_DONE +# undef LOAD_AVE_TYPE char ldavgbuf[3 * (INT_STRLEN_BOUND (int) + sizeof ".00 ")]; char const *ptr = ldavgbuf; int fd, count, saved_errno; - fd = open (LINUX_LDAV_FILE, O_RDONLY | O_CLOEXEC); + fd = open ("/proc/loadavg", O_RDONLY | O_CLOEXEC); if (fd == -1) return -1; count = read (fd, ldavgbuf, sizeof ldavgbuf - 1); @@ -554,7 +568,7 @@ getloadavg (double loadavg[], int nelem) return elem; -# endif /* __linux__ || __ANDROID__ || __CYGWIN__ */ +# endif /* __CYGWIN__ */ # if !defined (LDAV_DONE) && defined (__NetBSD__) /* NetBSD < 0.9 */ # define LDAV_DONE -- 2.39.5