1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-25 02:02:09 +03:00

* sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs_conf): Count

total processors using sysfs.
	(__get_nprocs): Use sysfs to determine which processors are online.
This commit is contained in:
Ulrich Drepper
2007-08-01 02:20:18 +00:00
parent e076bece18
commit 9506149a76
2 changed files with 71 additions and 41 deletions

View File

@ -1,7 +1,8 @@
2007-07-31 Ulrich Drepper <drepper@redhat.com> 2007-07-31 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs): Use /sys * sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs_conf): Count
filesystem to determine which processors are online. total processors using sysfs.
(__get_nprocs): Use sysfs to determine which processors are online.
2007-07-31 Jakub Jelinek <jakub@redhat.com> 2007-07-31 Jakub Jelinek <jakub@redhat.com>

View File

@ -67,12 +67,46 @@
while (0) while (0)
#endif #endif
int
__get_nprocs () static int
count_processors_in_proc (void)
{ {
char buffer[8192]; char buffer[8192];
int result = 1; 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. */ /* XXX Here will come a test for the new system call. */
/* Try to use the sysfs filesystem. It has actual information about /* Try to use the sysfs filesystem. It has actual information about
@ -122,66 +156,61 @@ __get_nprocs ()
return count; return count;
} }
/* The /proc/stat format is more uniform, use it by default. */ return count_processors_in_proc ();
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;
} }
weak_alias (__get_nprocs, get_nprocs) weak_alias (__get_nprocs, get_nprocs)
#ifdef GET_NPROCS_CONF_PARSER
/* On some architectures it is possible to distinguish between configured /* On some architectures it is possible to distinguish between configured
and active cpus. */ and active cpus. */
int int
__get_nprocs_conf () __get_nprocs_conf ()
{ {
char buffer[8192];
int result = 1;
/* XXX Here will come a test for the new system call. */ /* 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. */ /* If we haven't found an appropriate entry return 1. */
FILE *fp = fopen ("/proc/cpuinfo", "rc"); FILE *fp = fopen ("/proc/cpuinfo", "rc");
if (fp != NULL) if (fp != NULL)
{ {
char buffer[8192];
/* No threads use this stream. */ /* No threads use this stream. */
__fsetlocking (fp, FSETLOCKING_BYCALLER); __fsetlocking (fp, FSETLOCKING_BYCALLER);
GET_NPROCS_CONF_PARSER (fp, buffer, result); GET_NPROCS_CONF_PARSER (fp, buffer, result);
fclose (fp); fclose (fp);
} }
#else
result = count_processors_in_proc ();
#endif
return result; 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) weak_alias (__get_nprocs_conf, get_nprocs_conf)
/* General function to get information about memory status from proc /* General function to get information about memory status from proc