summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-08-01 02:20:18 +0000
committerUlrich Drepper <drepper@redhat.com>2007-08-01 02:20:18 +0000
commit9506149a76a66d3368ac0c156a9dbbfeac71428c (patch)
treed4a4a24d5a7b2ec1a77e78b860ef498c280cab9d /sysdeps/unix/sysv/linux
parente076bece18a91685d9748508f861dd033e4ae28d (diff)
* sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs_conf): Count
total processors using sysfs. (__get_nprocs): Use sysfs to determine which processors are online.
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/getsysstats.c107
1 files changed, 68 insertions, 39 deletions
diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
index 07cdfd7756..ee7a539a6f 100644
--- a/sysdeps/unix/sysv/linux/getsysstats.c
+++ b/sysdeps/unix/sysv/linux/getsysstats.c
@@ -67,12 +67,46 @@
while (0)
#endif
-int
-__get_nprocs ()
+
+static int
+count_processors_in_proc (void)
{
char buffer[8192];
int result = 1;
+ /* The /proc/stat format is more uniform, use it by default. */
+ FILE *fp = fopen ("/proc/stat", "rc");
+ if (fp != NULL)
+ {
+ /* No threads use this stream. */
+ __fsetlocking (fp, FSETLOCKING_BYCALLER);
+
+ result = 0;
+ while (fgets_unlocked (buffer, sizeof (buffer), fp) != NULL)
+ if (strncmp (buffer, "cpu", 3) == 0 && isdigit (buffer[3]))
+ ++result;
+
+ fclose (fp);
+ }
+ else
+ {
+ fp = fopen ("/proc/cpuinfo", "rc");
+ if (fp != NULL)
+ {
+ /* No threads use this stream. */
+ __fsetlocking (fp, FSETLOCKING_BYCALLER);
+ GET_NPROCS_PARSER (fp, buffer, result);
+ fclose (fp);
+ }
+ }
+
+ return result;
+}
+
+
+int
+__get_nprocs ()
+{
/* XXX Here will come a test for the new system call. */
/* Try to use the sysfs filesystem. It has actual information about
@@ -122,66 +156,61 @@ __get_nprocs ()
return count;
}
- /* The /proc/stat format is more uniform, use it by default. */
- FILE *fp = fopen ("/proc/stat", "rc");
- if (fp != NULL)
- {
- /* No threads use this stream. */
- __fsetlocking (fp, FSETLOCKING_BYCALLER);
-
- result = 0;
- while (fgets_unlocked (buffer, sizeof (buffer), fp) != NULL)
- if (strncmp (buffer, "cpu", 3) == 0 && isdigit (buffer[3]))
- ++result;
-
- fclose (fp);
- }
- else
- {
- fp = fopen ("/proc/cpuinfo", "rc");
- if (fp != NULL)
- {
- /* No threads use this stream. */
- __fsetlocking (fp, FSETLOCKING_BYCALLER);
- GET_NPROCS_PARSER (fp, buffer, result);
- fclose (fp);
- }
- }
-
- return result;
+ return count_processors_in_proc ();
}
weak_alias (__get_nprocs, get_nprocs)
-#ifdef GET_NPROCS_CONF_PARSER
/* On some architectures it is possible to distinguish between configured
and active cpus. */
int
__get_nprocs_conf ()
{
- char buffer[8192];
- int result = 1;
-
/* XXX Here will come a test for the new system call. */
+ /* Try to use the sysfs filesystem. It has actual information about
+ online processors. */
+ DIR *dir = __opendir ("/sys/devices/system/cpu");
+ if (dir != NULL)
+ {
+ int count = 0;
+ struct dirent64 *d;
+
+ while ((d = __readdir64 (dir)) != NULL)
+ /* NB: the sysfs has d_type support. */
+ if (d->d_type == DT_DIR && strncmp (d->d_name, "cpu", 3) == 0)
+ {
+ char *endp;
+ unsigned long int nr = strtoul (d->d_name + 3, &endp, 10);
+ if (nr != ULONG_MAX && endp != d->d_name + 3 && *endp == '\0')
+ ++count;
+ }
+
+ __closedir (dir);
+
+ return count;
+ }
+
+ int result = 1;
+
+#ifdef GET_NPROCS_CONF_PARSER
/* If we haven't found an appropriate entry return 1. */
FILE *fp = fopen ("/proc/cpuinfo", "rc");
if (fp != NULL)
{
+ char buffer[8192];
+
/* No threads use this stream. */
__fsetlocking (fp, FSETLOCKING_BYCALLER);
GET_NPROCS_CONF_PARSER (fp, buffer, result);
fclose (fp);
}
+#else
+ result = count_processors_in_proc ();
+#endif
return result;
}
-#else
-/* As far as I know Linux has no separate numbers for configured and
- available processors. So make the `get_nprocs_conf' function an
- alias. */
-strong_alias (__get_nprocs, __get_nprocs_conf)
-#endif
weak_alias (__get_nprocs_conf, get_nprocs_conf)
/* General function to get information about memory status from proc