diff options
author | Nicolas Cavallari <nicolas.cavallari@green-communications.fr> | 2016-06-14 15:12:18 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2016-06-15 20:42:52 +0200 |
commit | 5e3d8e668238f1ebbf96843ceb0a699d73a16a38 (patch) | |
tree | 6fea2bcb318b013312222e2f80372f08ee26e48e /libc | |
parent | 766da4190705a32fbddd5d0fe61175d76ad31090 (diff) |
sysconf: Support _SC_(AV)?PHYS_PAGES.
Do it by following the trail of the existing commented code, which
implemented it by calling get_phys_pages() and get_avphys_pages().
This patch implements these two functions, which are also glibc
extensions.
Some program/libraries (e.g. libuv) assumes that sysconf(_SC_PHYS_PAGES)
works on linux and never check for -1, thus they report an insane amount
of memory.
Signed-off-by: Nicolas Cavallari <nicolas.cavallari@green-communications.fr>
Diffstat (limited to 'libc')
-rw-r--r-- | libc/unistd/sysconf.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/libc/unistd/sysconf.c b/libc/unistd/sysconf.c index 503b39585..3d3b1a5ff 100644 --- a/libc/unistd/sysconf.c +++ b/libc/unistd/sysconf.c @@ -43,6 +43,32 @@ #include <dirent.h> #include "internal/parse_config.h" +long int get_phys_pages(void) +{ + struct sysinfo si; + int ps = getpagesize();; + + sysinfo(&si); + + if (ps >= si.mem_unit) + return si.totalram / (ps / si.mem_unit); + else + return si.totalram * (si.mem_unit / ps); +} + +long int get_avphys_pages(void) +{ + struct sysinfo si; + int ps = getpagesize();; + + sysinfo(&si); + + if (ps >= si.mem_unit) + return si.freeram / (ps / si.mem_unit); + else + return si.freeram * (si.mem_unit / ps); +} + static int nprocessors_onln(void) { char **l = NULL; @@ -747,18 +773,10 @@ long int sysconf(int name) RETURN_FUNCTION(nprocessors_onln()); case _SC_PHYS_PAGES: -#if 0 RETURN_FUNCTION(get_phys_pages()); -#else - RETURN_NEG_1; -#endif case _SC_AVPHYS_PAGES: -#if 0 RETURN_FUNCTION(get_avphys_pages()); -#else - RETURN_NEG_1; -#endif case _SC_ATEXIT_MAX: return __UCLIBC_MAX_ATEXIT; |