about summary refs log tree commit diff
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.gz
glibc-0abf17decfe2109955f8c35392770ea708cf5962.tar.xz
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;