aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-08-01 21:23:59 +0000
committerUlrich Drepper <drepper@redhat.com>2007-08-01 21:23:59 +0000
commit0abf17decfe2109955f8c35392770ea708cf5962 (patch)
tree6dc6bfe3bcc1f6a6aa8ae219709530f5f0cfae62
parent5e0923ab31aa77bbd46737c4b8b327dbe2494b00 (diff)
downloadglibc-0abf17decfe2109955f8c35392770ea708cf5962.tar
glibc-0abf17decfe2109955f8c35392770ea708cf5962.tar.gz
glibc-0abf17decfe2109955f8c35392770ea708cf5962.tar.bz2
glibc-0abf17decfe2109955f8c35392770ea708cf5962.zip
* sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs): Using
/proc is faster and sufficient. /sys is still needed for __get_nprocs_conf.
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/unix/sysv/linux/getsysstats.c64
2 files changed, 11 insertions, 59 deletions
diff --git a/ChangeLog b/ChangeLog
index 9e8aed9389..2da5cdc448 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-08-01 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs): Using
+ /proc is faster and sufficient. /sys is still needed for
+ __get_nprocs_conf.
+
2007-08-01 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/i386/syscalls.list (fallocate): Add fallocate
diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
index ee7a539a6f..6d4c9c06e8 100644
--- a/sysdeps/unix/sysv/linux/getsysstats.c
+++ b/sysdeps/unix/sysv/linux/getsysstats.c
@@ -68,9 +68,11 @@
#endif
-static int
-count_processors_in_proc (void)
+int
+__get_nprocs ()
{
+ /* XXX Here will come a test for the new system call. */
+
char buffer[8192];
int result = 1;
@@ -102,62 +104,6 @@ count_processors_in_proc (void)
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
- online processors. */
- DIR *dir = __opendir ("/sys/devices/system/cpu");
- if (dir != NULL)
- {
- int dfd = dirfd (dir);
- 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')
- {
- /* Try reading the online file. */
- char oname[_D_ALLOC_NAMLEN (d) + sizeof "/online"];
- strcpy (stpcpy (oname, d->d_name), "/online");
-
- /* We unconditionally use openat since the "online"
- file became readable only after the openat system
- call was introduced. */
- char buf[1];
- int fd = openat_not_cancel_3 (dfd, oname, O_RDONLY);
-
- /* If we cannot read the online file we have to assume
- the CPU is online. */
- if (fd < 0)
- ++count;
- else
- {
- if (read_not_cancel (fd, buf, sizeof (buf)) < 0
- || buf[0] == '1')
- ++count;
-
- close_not_cancel_no_status (fd);
- }
- }
- }
-
- __closedir (dir);
-
- return count;
- }
-
- return count_processors_in_proc ();
-}
weak_alias (__get_nprocs, get_nprocs)
@@ -206,7 +152,7 @@ __get_nprocs_conf ()
fclose (fp);
}
#else
- result = count_processors_in_proc ();
+ result = __get_nprocs ();
#endif
return result;