mirror of git://sourceware.org/git/glibc.git
Don't search for proc mount point. We assume procfs is mounted at /proc in many other places already.
This commit is contained in:
parent
4f7e7f8e00
commit
5c980df9a2
|
|
@ -1,5 +1,5 @@
|
||||||
/* Determine various system internal values, Linux version.
|
/* Determine various system internal values, Linux version.
|
||||||
Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1996-2001, 2002, 2003, 2006 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
|
||||||
|
|
@ -34,75 +34,6 @@
|
||||||
#include <atomic.h>
|
#include <atomic.h>
|
||||||
|
|
||||||
|
|
||||||
/* The default value for the /proc filesystem mount point. */
|
|
||||||
static const char path_proc[] = "/proc";
|
|
||||||
|
|
||||||
/* Actual mount point of /proc filesystem. */
|
|
||||||
libc_freeres_ptr (static char *mount_proc);
|
|
||||||
|
|
||||||
/* Determine the path to the /proc filesystem if available. */
|
|
||||||
static const char *
|
|
||||||
internal_function
|
|
||||||
get_proc_path (char *buffer, size_t bufsize)
|
|
||||||
{
|
|
||||||
struct mntent mount_point;
|
|
||||||
struct mntent *entry;
|
|
||||||
char *result = NULL;
|
|
||||||
char *copy_result;
|
|
||||||
FILE *fp;
|
|
||||||
|
|
||||||
/* First find the mount point of the proc filesystem. */
|
|
||||||
fp = __setmntent (_PATH_MOUNTED, "r");
|
|
||||||
if (fp == NULL)
|
|
||||||
fp = __setmntent (_PATH_MNTTAB, "r");
|
|
||||||
if (fp != NULL)
|
|
||||||
{
|
|
||||||
/* We don't need locking. */
|
|
||||||
(void) __fsetlocking (fp, FSETLOCKING_BYCALLER);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we haven't found anything this is generally a bad sign but we
|
|
||||||
handle it gracefully. We return what is hopefully the right
|
|
||||||
answer (/proc) but we don't remember this. This will enable
|
|
||||||
programs which started before the system is fully running to
|
|
||||||
adjust themselves. */
|
|
||||||
if (result == NULL)
|
|
||||||
return path_proc;
|
|
||||||
|
|
||||||
/* Make a copy we can keep around. */
|
|
||||||
copy_result = __strdup (result);
|
|
||||||
if (copy_result == NULL)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
/* Now store the copied value. But do it atomically. */
|
|
||||||
assert (sizeof (long int) == sizeof (void *__unbounded));
|
|
||||||
if (atomic_compare_and_exchange_bool_acq (&mount_proc, copy_result, NULL))
|
|
||||||
/* Replacing the value failed. This means another thread was
|
|
||||||
faster and we don't need the copy anymore. */
|
|
||||||
free (copy_result);
|
|
||||||
#if __BOUNDED_POINTERS__
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* compare_and_swap only copied the pointer value, so we must
|
|
||||||
now copy the bounds as well. */
|
|
||||||
__ptrlow (mount_proc) = __ptrlow (copy_result);
|
|
||||||
__ptrhigh (mount_proc) = __ptrhigh (copy_result);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return mount_proc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* How we can determine the number of available processors depends on
|
/* How we can determine the number of available processors depends on
|
||||||
the configuration. There is currently (as of version 2.0.21) no
|
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
|
system call to determine the number. It is planned for the 2.1.x
|
||||||
|
|
@ -136,50 +67,35 @@ get_proc_path (char *buffer, size_t bufsize)
|
||||||
int
|
int
|
||||||
__get_nprocs ()
|
__get_nprocs ()
|
||||||
{
|
{
|
||||||
FILE *fp;
|
|
||||||
char buffer[8192];
|
char buffer[8192];
|
||||||
const char *proc_path;
|
|
||||||
int result = 1;
|
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. */
|
||||||
|
|
||||||
/* Get mount point of proc filesystem. */
|
/* The /proc/stat format is more uniform, use it by default. */
|
||||||
proc_path = get_proc_path (buffer, sizeof buffer);
|
FILE *fp = fopen ("/proc/stat", "rc");
|
||||||
|
if (fp != NULL)
|
||||||
/* If we haven't found an appropriate entry return 1. */
|
|
||||||
if (proc_path != NULL)
|
|
||||||
{
|
{
|
||||||
char *proc_fname = alloca (strlen (proc_path) + sizeof ("/cpuinfo"));
|
/* No threads use this stream. */
|
||||||
|
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||||
|
|
||||||
/* The /proc/stat format is more uniform, use it by default. */
|
result = 0;
|
||||||
__stpcpy (__stpcpy (proc_fname, proc_path), "/stat");
|
while (fgets_unlocked (buffer, sizeof (buffer), fp) != NULL)
|
||||||
|
if (strncmp (buffer, "cpu", 3) == 0 && isdigit (buffer[3]))
|
||||||
|
++result;
|
||||||
|
|
||||||
fp = fopen (proc_fname, "rc");
|
fclose (fp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fp = fopen ("/proc/cpuinfo", "rc");
|
||||||
if (fp != NULL)
|
if (fp != NULL)
|
||||||
{
|
{
|
||||||
/* No threads use this stream. */
|
/* No threads use this stream. */
|
||||||
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||||
|
GET_NPROCS_PARSER (fp, buffer, result);
|
||||||
result = 0;
|
|
||||||
while (fgets_unlocked (buffer, sizeof (buffer), fp) != NULL)
|
|
||||||
if (strncmp (buffer, "cpu", 3) == 0 && isdigit (buffer[3]))
|
|
||||||
++result;
|
|
||||||
|
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
__stpcpy (__stpcpy (proc_fname, proc_path), "/cpuinfo");
|
|
||||||
|
|
||||||
fp = fopen (proc_fname, "rc");
|
|
||||||
if (fp != NULL)
|
|
||||||
{
|
|
||||||
/* No threads use this stream. */
|
|
||||||
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
|
||||||
GET_NPROCS_PARSER (fp, buffer, result);
|
|
||||||
fclose (fp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
@ -193,30 +109,19 @@ weak_alias (__get_nprocs, get_nprocs)
|
||||||
int
|
int
|
||||||
__get_nprocs_conf ()
|
__get_nprocs_conf ()
|
||||||
{
|
{
|
||||||
FILE *fp;
|
|
||||||
char buffer[8192];
|
char buffer[8192];
|
||||||
const char *proc_path;
|
|
||||||
int result = 1;
|
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. */
|
||||||
|
|
||||||
/* 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 we haven't found an appropriate entry return 1. */
|
||||||
if (proc_path != NULL)
|
FILE *fp = fopen ("/proc/cpuinfo", "rc");
|
||||||
|
if (fp != NULL)
|
||||||
{
|
{
|
||||||
char *proc_cpuinfo = alloca (strlen (proc_path) + sizeof ("/cpuinfo"));
|
/* No threads use this stream. */
|
||||||
__stpcpy (__stpcpy (proc_cpuinfo, proc_path), "/cpuinfo");
|
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||||
|
GET_NPROCS_CONF_PARSER (fp, buffer, result);
|
||||||
fp = fopen (proc_cpuinfo, "rc");
|
fclose (fp);
|
||||||
if (fp != NULL)
|
|
||||||
{
|
|
||||||
/* No threads use this stream. */
|
|
||||||
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
|
||||||
GET_NPROCS_CONF_PARSER (fp, buffer, result);
|
|
||||||
fclose (fp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
@ -235,40 +140,29 @@ static long int
|
||||||
internal_function
|
internal_function
|
||||||
phys_pages_info (const char *format)
|
phys_pages_info (const char *format)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
|
||||||
char buffer[8192];
|
char buffer[8192];
|
||||||
const char *proc_path;
|
|
||||||
long int result = -1;
|
long 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 we haven't found an appropriate entry return 1. */
|
||||||
if (proc_path != NULL)
|
FILE *fp = fopen ("/proc/meminfo", "rc");
|
||||||
|
if (fp != NULL)
|
||||||
{
|
{
|
||||||
char *proc_meminfo = alloca (strlen (proc_path) + sizeof ("/meminfo"));
|
/* No threads use this stream. */
|
||||||
__stpcpy (__stpcpy (proc_meminfo, proc_path), "/meminfo");
|
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||||
|
|
||||||
fp = fopen (proc_meminfo, "rc");
|
result = 0;
|
||||||
if (fp != NULL)
|
/* Read all lines and count the lines starting with the
|
||||||
{
|
string "processor". We don't have to fear extremely long
|
||||||
/* No threads use this stream. */
|
lines since the kernel will not generate them. 8192
|
||||||
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
bytes are really enough. */
|
||||||
|
while (fgets_unlocked (buffer, sizeof buffer, fp) != NULL)
|
||||||
|
if (sscanf (buffer, format, &result) == 1)
|
||||||
|
{
|
||||||
|
result /= (__getpagesize () / 1024);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
result = 0;
|
fclose (fp);
|
||||||
/* 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_unlocked (buffer, sizeof buffer, fp) != NULL)
|
|
||||||
if (sscanf (buffer, format, &result) == 1)
|
|
||||||
{
|
|
||||||
result /= (__getpagesize () / 1024);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose (fp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == -1)
|
if (result == -1)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue