klibc-bot for H. Peter Anvin
2013-May-13 18:39 UTC
[klibc] [klibc:sysconf] Framework and trivial implementation of sysconf(3)
Commit-ID: 0e725b1ec953aafa7cec75a22436319e945f93e1 Gitweb: http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=0e725b1ec953aafa7cec75a22436319e945f93e1 Author: H. Peter Anvin <hpa at linux.intel.com> AuthorDate: Mon, 13 May 2013 11:36:38 -0700 Committer: H. Peter Anvin <hpa at linux.intel.com> CommitDate: Mon, 13 May 2013 11:36:38 -0700 [klibc] Framework and trivial implementation of sysconf(3) Framework for sysconf(3) that hopefully doesn't pull in all possible sysconf data providers every time it is referenced. So far only the page size is provided. Signed-off-by: H. Peter Anvin <hpa at linux.intel.com> --- usr/dash/config.h | 2 +- usr/include/sys/sysconf.h | 40 ++++++++++++++++++++++++++++++++++++++++ usr/include/unistd.h | 7 +++++-- usr/klibc/Kbuild | 3 ++- usr/klibc/sysconf/sysconf.c | 8 ++++++++ 5 files changed, 56 insertions(+), 4 deletions(-) diff --git a/usr/dash/config.h b/usr/dash/config.h index 35230c7..9757009 100644 --- a/usr/dash/config.h +++ b/usr/dash/config.h @@ -81,7 +81,7 @@ #define HAVE_STRTOUMAX 1 /* Define to 1 if you have the `sysconf' function. */ -/* #undef HAVE_SYSCONF */ +#define HAVE_SYSCONF 1 /* Define to 1 if you have the <sys/stat.h> header file. */ #define HAVE_SYS_STAT_H 1 diff --git a/usr/include/sys/sysconf.h b/usr/include/sys/sysconf.h new file mode 100644 index 0000000..13ababc --- /dev/null +++ b/usr/include/sys/sysconf.h @@ -0,0 +1,40 @@ +/* + * sys/sysconf.h + * + * sysconf() macros and demultiplex + * This file is included in <unistd.h> + * + * Add things here as needed, we don't really want to add things wildly. + * For things that require a lot of code, create an out-of-line function + * and put it in a .c file in the sysconf directory. + */ + +#ifndef _SYS_SYSCONF_H +#define _SYS_SYSCONF_H + +#ifndef _UNISTD_H +# include <unistd.h> +#endif +#include <errno.h> + +enum sysconf { + _SC_PAGESIZE = 1, +}; + +__extern long sysconf(int); + +__must_inline long __sysconf_inline(int __val) +{ + switch (__val) { + case _SC_PAGESIZE: + return getpagesize(); + default: + errno = EINVAL; + return -1; + } +} + +#define sysconf(x) \ + (__builtin_constant_p(x) ? __sysconf_inline(x) : sysconf(x)) + +#endif /* _SYS_SYSCONF_H */ diff --git a/usr/include/unistd.h b/usr/include/unistd.h index f0e19c2..d425df8 100644 --- a/usr/include/unistd.h +++ b/usr/include/unistd.h @@ -144,13 +144,13 @@ __extern int optind, opterr, optopt; __extern int isatty(int); __extern unsigned int __page_size; -static __inline__ int getpagesize(void) +__must_inline int getpagesize(void) { return __page_size; } __extern unsigned int __page_shift; -static __inline__ int __getpageshift(void) +__must_inline int __getpageshift(void) { return __page_shift; } @@ -162,4 +162,7 @@ __extern int daemon(int, int); #define STDOUT_FILENO 1 #define STDERR_FILENO 2 +/* This #include must be at the end */ +#include <sys/sysconf.h> + #endif /* _UNISTD_H */ diff --git a/usr/klibc/Kbuild b/usr/klibc/Kbuild index 2bef9ca..da1dce0 100644 --- a/usr/klibc/Kbuild +++ b/usr/klibc/Kbuild @@ -70,7 +70,8 @@ klib-y += vsnprintf.o snprintf.o vsprintf.o sprintf.o \ stdio/fread.o stdio/fwrite.o stdio/fflush.o \ stdio/ungetc.o stdio/fgetc.o \ stdio/fseek.o stdio/ftell.o stdio/rewind.o \ - stdio/fileno.o stdio/feof.o stdio/ferror.o + stdio/fileno.o stdio/feof.o stdio/ferror.o \ + sysconf/sysconf.o klib-$(CONFIG_KLIBC_ERRLIST) += errlist.o diff --git a/usr/klibc/sysconf/sysconf.c b/usr/klibc/sysconf/sysconf.c new file mode 100644 index 0000000..0e21beb --- /dev/null +++ b/usr/klibc/sysconf/sysconf.c @@ -0,0 +1,8 @@ +#include <sys/sysconf.h> + +#undef sysconf + +long sysconf(int val) +{ + return __sysconf_inline(val); +}
Possibly Parallel Threads
- [klibc:master] tests: Add a trivial test for sysconf()
- [klibc:master] tests: Add a trivial test for sysconf()
- [PATCH common] mlutils: Simple wrapper around sysconf (_SC_NPROCESSORS_ONLN).
- Request to merge branch sysconf into master
- [Bug 3735] New: The ngroups variable may be set to a negative value when calling sysconf(_SC_NGROUPS_MAX)