diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/generic/confname.h | 15 | ||||
-rw-r--r-- | sysdeps/generic/sys/sysinfo.h | 41 | ||||
-rw-r--r-- | sysdeps/posix/sysconf.c | 25 | ||||
-rw-r--r-- | sysdeps/stub/getsysstats.c | 68 | ||||
-rw-r--r-- | sysdeps/stub/sysconf.c | 25 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/getsysstats.c | 200 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sys/sysinfo.h | 18 |
8 files changed, 393 insertions, 1 deletions
diff --git a/sysdeps/generic/confname.h b/sysdeps/generic/confname.h index d0968a1ba5..3d76843d12 100644 --- a/sysdeps/generic/confname.h +++ b/sysdeps/generic/confname.h @@ -224,6 +224,21 @@ enum #define _SC_THREAD_PRIO_PROTECT _SC_THREAD_PRIO_PROTECT _SC_THREAD_PROCESS_SHARED, #define _SC_THREAD_PROCESS_SHARED _SC_THREAD_PROCESS_SHARED + + _SC_NPROCESSORS_CONF, +#define _SC_NPROCESSORS_CONF _SC_NPROCESSORS_CONF + _SC_NPROCESSORS_ONLN, +#define _SC_NPROCESSORS_ONLN _SC_NPROCESSORS_ONLN + _SC_PHYS_PAGES, +#define _SC_PHYS_PAGES _SC_PHYS_PAGES + _SC_AVPHYS_PAGES, +#define _SC_AVPHYS_PAGES _SC_AVPHYS_PAGES + _SC_ATEXIT_MAX, +#define _SC_ATEXIT_MAX _SC_ATEXIT_MAX + _SC_PASS_MAX, +#define _SC_PASS_MAX _SC_PASS_MAX + _SC_XOPEN_VERSION +#define _SC_XOPEN_VERSION _SC_XOPEN_VERSION }; #ifdef __USE_POSIX2 diff --git a/sysdeps/generic/sys/sysinfo.h b/sysdeps/generic/sys/sysinfo.h new file mode 100644 index 0000000000..e9f667499e --- /dev/null +++ b/sysdeps/generic/sys/sysinfo.h @@ -0,0 +1,41 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef _SYS_SYSINFO_H + +#define _SYS_SYSINFO_H 1 +#include <features.h> + +/* Return number of configured processors. */ +extern int __get_nproc_conf __P ((void)); +extern int get_nproc_conf __P ((void)); + +/* Return number of available processors. */ +extern int __get_nproc __P ((void)); +extern int get_nproc __P ((void)); + + +/* Return number of physical pages of memory in the system. */ +extern int __get_phys_pages __P ((void)); +extern int get_phys_pages __P ((void)); + +/* Return number of available physical pages of memory in the system. */ +extern int __get_avphys_pages __P ((void)); +extern int get_avphys_pages __P ((void)); + +#endif /* sys/sysinfo.h */ diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c index 29d06135c6..14ee58cafb 100644 --- a/sysdeps/posix/sysconf.c +++ b/sysdeps/posix/sysconf.c @@ -24,6 +24,7 @@ Cambridge, MA 02139, USA. */ #include <stdio.h> #include <time.h> #include <unistd.h> +#include <sys/sysinfo.h> extern int __getdtablesize __P ((void)); extern size_t __getpagesize __P ((void)); @@ -595,6 +596,30 @@ __sysconf (name) #else return -1; #endif + + case _SC_NPROCESSORS_CONF: + return __get_nprocs_conf (); + + case _SC_NPROCESSORS_ONLN: + return __get_nprocs (); + + case _SC_PHYS_PAGES: + return __get_phys_pages (); + + case _SC_AVPHYS_PAGES: + return __get_avphys_pages (); + + case _SC_ATEXIT_MAX: + /* We have no limit since we use lists. */ + return INT_MAX; + + case _SC_PASS_MAX: + /* We have no limit but since the return value might be used to + allocate a buffer we restrict the value. */ + return BUFSIZ; + + case _SC_XOPEN_VERSION: + return _XOPEN_VERSION; } } diff --git a/sysdeps/stub/getsysstats.c b/sysdeps/stub/getsysstats.c new file mode 100644 index 0000000000..c8fe700ded --- /dev/null +++ b/sysdeps/stub/getsysstats.c @@ -0,0 +1,68 @@ +/* getsysstats - Determine various system internal values, stub version. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <sys/sysinfo.h> + +int +__get_nprocs_conf () +{ + /* We don't know how to determine the number. Simply return always 1. */ + return 1; +} +weak_alias (__get_nprocs_conf, get_nprocs_conf) + +link_warning (get_nprocs_conf, "warning: get_nprocs_conf will always return 1") + + + +int +__get_nprocs () +{ + /* We don't know how to determine the number. Simply return always 1. */ + return 1; +} +weak_alias (__get_nprocs, get_nprocs) + +link_warning (get_nprocs, "warning: get_nprocs will always return 1") + + +int +__get_phys_pages () +{ + /* We have no general way to determine this value. */ + errno = ENOSYS; + return -1; +} +weak_alias (__get_phys_pages, get_phys_pages) + +link_warning (get_phys_pages, "warning: get_phys_pages will always fail") + + +int +__get_avphys_pages () +{ + /* We have no general way to determine this value. */ + errno = ENOSYS; + return -1; +} +weak_alias (__get_avphys_pages, get_avphys_pages) + +link_warning (get_avphys_pages, "warning: get_avphys_pages will always fail") diff --git a/sysdeps/stub/sysconf.c b/sysdeps/stub/sysconf.c index 613ef674b8..1351b48fe0 100644 --- a/sysdeps/stub/sysconf.c +++ b/sysdeps/stub/sysconf.c @@ -17,9 +17,11 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <errno.h> +#include <stdio.h> #include <unistd.h> #include <time.h> #include <limits.h> +#include <sys/sysinfo.h> /* Get the value of the system variable NAME. */ @@ -64,6 +66,27 @@ __sysconf (name) return -1; #endif + case _SC_NPROCESSORS_CONF: + return __get_nprocs_conf (); + + case _SC_NPROCESSORS_ONLN: + return __get_nprocs (); + + case _SC_PHYS_PAGES: + return __get_phys_pages (); + + case _SC_AVPHYS_PAGES: + return __get_avphys_pages (); + + case _SC_ATEXIT_MAX: + /* We have no limit since we use lists. */ + return INT_MAX; + + case _SC_PASS_MAX: + /* We have no limit but since the return value might be used to + allocate a buffer we restrict the value. */ + return BUFSIZ; + case _SC_ARG_MAX: case _SC_CHILD_MAX: case _SC_CLK_TCK: @@ -145,6 +168,8 @@ __sysconf (name) case _SC_THREAD_PRIO_PROTECT: case _SC_THREAD_PROCESS_SHARED: + case _SC_XOPEN_VERSION: + break; } diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 02b44a8fc5..33220df5f6 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -5,7 +5,7 @@ endif ifeq ($(subdir), misc) sysdep_routines += sysctl clone -sysdep_headers += sys/mount.h sys/sysinfo.h sys/acct.h sys/sysctl.h \ +sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ sys/module.h sys/io.h sys/klog.h sys/kdaemon.h \ sys/user.h syscall-list.h sys/sysmacros.h sys/procfs.h diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c new file mode 100644 index 0000000000..81946b422f --- /dev/null +++ b/sysdeps/unix/sysv/linux/getsysstats.c @@ -0,0 +1,200 @@ +/* getsysstats - Determine various system internal values, Linux version. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <mntent.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/sysinfo.h> + + +/* Determine the path to the /proc filesystem if available. */ +static char * +get_proc_path (char *buffer, size_t bufsize) +{ + FILE *fp; + struct mntent mount_point; + struct mntent *entry; + char *result; + + /* First find the mount point of the proc filesystem. */ + fp = __setmntent (_PATH_MNTTAB, "r"); + if (fp == NULL) + /* Cannot find mount table file. */ + result = NULL; + else + { + while ((entry = __getmntent_r (fp, &mount_point, buffer, bufsize)) + != NULL) + if (strcmp (mount_point.mnt_type, "proc") == 0) + { + result = mount_point.mnt_dir; + break; + } + __endmntent (fp); + } + + return result; +} + + +/* How we can determine the number of available processors depends on + the configuration. There is currently (as of version 2.0.21) no + system call to determine the number. It is planned for the 2.1.x + series to add this, though. + + One possibility to implement it for systems using Linux 2.0 is to + examine the pseudo file /proc/meminfo. Here we have one entry for + each processor. + + But not all systems have support for the /proc filesystem. If it + is not available we simply return 1 since there is no way. */ +int +__get_nprocs () +{ + FILE *fp; + char buffer[8192]; + char *proc_path; + int result = 1; + + /* XXX Here will come a test for the new system call. */ + + /* Get mount point of proc filesystem. */ + proc_path = get_proc_path (buffer, sizeof buffer); + + /* If we haven't found an appropriate entry return 1. */ + if (proc_path != NULL) + { + char *proc_cpuinfo = alloca (strlen (proc_path) + sizeof ("/cpuinfo")); + __stpcpy (__stpcpy (proc_cpuinfo, proc_path), "/cpuinfo"); + + fp = fopen (proc_cpuinfo, "r"); + if (fp != NULL) + { + result = 0; + /* Read all lines and count the lines starting with the + string "processor". We don't have to fear extremely long + lines since the kernel will not generate them. 8192 + bytes are really enough. */ + while (fgets (buffer, sizeof buffer, fp) != NULL) + if (strncmp (buffer, "processor", 9) == 0) + ++result; + + fclose (fp); + } + } + + return result; +} +weak_alias (__get_nprocs, get_nprocs) + +/* As far as I know Linux has no separate numbers for configured and + available processors. So make the `get_nprocs_conf' function an + prototype. */ +strong_alias (__get_nprocs, __get_nprocs_conf) +weak_alias (__get_nprocs, get_nprocs_conf) + + +/* General function to get information about memory status from proc + filesystem. */ +static int +phys_pages_info (const char *format) +{ + FILE *fp; + char buffer[8192]; + char *proc_path; + int result = -1; + + /* Get mount point of proc filesystem. */ + proc_path = get_proc_path (buffer, sizeof buffer); + + /* If we haven't found an appropriate entry return 1. */ + if (proc_path != NULL) + { + char *proc_meminfo = alloca (strlen (proc_path) + sizeof ("/meminfo")); + __stpcpy (__stpcpy (proc_meminfo, proc_path), "/meminfo"); + + fp = fopen (proc_meminfo, "r"); + if (fp != NULL) + { + result = 0; + /* Read all lines and count the lines starting with the + string "processor". We don't have to fear extremely long + lines since the kernel will not generate them. 8192 + bytes are really enough. */ + while (fgets (buffer, sizeof buffer, fp) != NULL) + if (sscanf (buffer, format, &result) == 1) + { + result /= (__getpagesize () / 1024); + break; + } + + fclose (fp); + } + } + + if (result == -1) + /* We cannot get the needed value: signal an error. */ + errno = ENOSYS; + + return result; +} + + +/* Return the number of pages of physical memory in the system. There + is currently (as of version 2.0.21) no system call to determine the + number. It is planned for the 2.1.x series to add this, though. + + One possibility to implement it for systems using Linux 2.0 is to + examine the pseudo file /proc/cpuinfo. Here we have one entry for + each processor. + + But not all systems have support for the /proc filesystem. If it + is not available we return -1 as an error signal. */ +int +__get_phys_pages () +{ + /* XXX Here will come a test for the new system call. */ + + return phys_pages_info ("MemTotal: %d kB"); +} +weak_alias (__get_phys_pages, get_phys_pages) + + +/* Return the number of available pages of physical memory in the + system. There is currently (as of version 2.0.21) no system call + to determine the number. It is planned for the 2.1.x series to add + this, though. + + One possibility to implement it for systems using Linux 2.0 is to + examine the pseudo file /proc/cpuinfo. Here we have one entry for + each processor. + + But not all systems have support for the /proc filesystem. If it + is not available we return -1 as an error signal. */ +int +__get_avphys_pages () +{ + /* XXX Here will come a test for the new system call. */ + + return phys_pages_info ("MemFree: %d kB"); +} +weak_alias (__get_avphys_pages, get_avphys_pages) diff --git a/sysdeps/unix/sysv/linux/sys/sysinfo.h b/sysdeps/unix/sysv/linux/sys/sysinfo.h index c05da05b3d..1fabb06392 100644 --- a/sysdeps/unix/sysv/linux/sys/sysinfo.h +++ b/sysdeps/unix/sysv/linux/sys/sysinfo.h @@ -27,4 +27,22 @@ Boston, MA 02111-1307, USA. */ /* Returns information on overall system statistics. */ extern int sysinfo __P ((struct sysinfo *__info)); + +/* Return number of configured processors. */ +extern int __get_nproc_conf __P ((void)); +extern int get_nproc_conf __P ((void)); + +/* Return number of available processors. */ +extern int __get_nproc __P ((void)); +extern int get_nproc __P ((void)); + + +/* Return number of physical pages of memory in the system. */ +extern int __get_phys_pages __P ((void)); +extern int get_phys_pages __P ((void)); + +/* Return number of available physical pages of memory in the system. */ +extern int __get_avphys_pages __P ((void)); +extern int get_avphys_pages __P ((void)); + #endif /* sys/sysinfo.h */ |