Skip to content

Commit

Permalink
Use a /sys/devices/system/cpu/online for _SC_NPROCESSORS_ONLN impleme…
Browse files Browse the repository at this point in the history
…ntation
  • Loading branch information
Ulrich Drepper committed Jun 22, 2011
1 parent 852eb34 commit 84e2a55
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
3 changes: 3 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
2011-06-22 Ulrich Drepper <drepper@gmail.com>

* sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs): Use
/sys/devices/system/cpu/online if it is usable.

* sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs): Rate limit
reading the information from the /proc filesystem to once a second.

Expand Down
52 changes: 49 additions & 3 deletions sysdeps/unix/sysv/linux/getsysstats.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,20 +161,65 @@ __get_nprocs ()
char *buffer_end = buffer + buffer_size;
char *cp = buffer_end;
char *re = buffer_end;
int result = 1;

#ifdef O_CLOEXEC
const int flags = O_RDONLY | O_CLOEXEC;
#else
const int flags = O_RDONLY;
#endif
int fd = open_not_cancel_2 ("/sys/devices/system/cpu/online", flags);
char *l;
int result = 0;
if (fd != -1)
{
l = next_line (fd, buffer, &cp, &re, buffer_end);
if (l != NULL)
do
{
char *endp;
unsigned long int n = strtoul (l, &endp, 10);
if (l == endp)
{
result = 0;
break;
}

unsigned long int m = n;
if (*endp == '-')
{
l = endp + 1;
m = strtoul (l, &endp, 10);
if (l == endp)
{
result = 0;
break;
}
}

result += m - n + 1;

l = endp;
while (l < re && isspace (*l))
++l;
}
while (l < re);

close_not_cancel_no_status (fd);

if (result > 0)
goto out;
}

cp = buffer_end;
re = buffer_end;
result = 1;

/* The /proc/stat format is more uniform, use it by default. */
int fd = open_not_cancel_2 ("/proc/stat", flags);
fd = open_not_cancel_2 ("/proc/stat", flags);
if (fd != -1)
{
result = 0;

char *l;
while ((l = next_line (fd, buffer, &cp, &re, buffer_end)) != NULL)
/* The current format of /proc/stat has all the cpu* entries
at the front. We assume here that stays this way. */
Expand All @@ -195,6 +240,7 @@ __get_nprocs ()
}
}

out:
cached_result = result;
atomic_write_barrier ();
timestamp = ts.tv_sec;
Expand Down

0 comments on commit 84e2a55

Please sign in to comment.