2011-02-12 05:22:29 +00:00
|
|
|
#ifndef _LIMITS_H
|
|
|
|
#define _LIMITS_H
|
|
|
|
|
2012-09-08 03:13:55 +00:00
|
|
|
#include <features.h>
|
|
|
|
|
2011-02-12 05:22:29 +00:00
|
|
|
/* Most limits are system-specific */
|
|
|
|
|
|
|
|
#include <bits/limits.h>
|
|
|
|
|
2012-03-21 01:10:06 +00:00
|
|
|
/* Support signed or unsigned plain-char */
|
|
|
|
|
fix dubious char signedness check in limits.h
commit 201995f382cc698ae19289623cc06a70048ffe7b introduced a hack
utilizing the signedness of character constants at the preprocessor
level to avoid depending on the gcc-specific __CHAR_UNSIGNED__ predef.
while this trick works on gcc and presumably other compilers being
used, it's not clear that the behavior it depends on is actually
conforming. C11 6.4.4.4 ¶10 defines character constants as having type
int, and 6.10.1 ¶4 defines preprocessor #if arithmetic to take place
in intmax_t or uintmax_t, depending on the signedness of the integer
operand types, and it is specified that "this includes interpreting
character constants".
if character literals had type char and just promoted to int, it would
be clear that when char is unsigned they should behave as uintmax_t at
the preprocessor level. however, as written the text of the standard
seems to require that character constants always behave as intmax_t,
corresponding to int, at the preprocessor level.
since there is a good deal of ambiguity about the correct behavior and
a risk that compilers will disagree or that an interpretation may
mandate a change in the behavior, do not rely on it for defining
CHAR_MIN and CHAR_MAX correctly. instead, use the signedness of the
value (as opposed to the type) of '\xff', which will be positive if
and only if plain char is unsigned. this behavior is clearly
specified, and the specific case '\xff' is even used in an example,
under 6.4.4.4 of the standard.
2018-08-28 17:54:50 +00:00
|
|
|
#if '\xff' > 0
|
2012-03-21 01:10:06 +00:00
|
|
|
#define CHAR_MIN 0
|
|
|
|
#define CHAR_MAX 255
|
|
|
|
#else
|
|
|
|
#define CHAR_MIN (-128)
|
|
|
|
#define CHAR_MAX 127
|
|
|
|
#endif
|
|
|
|
|
2011-02-12 05:22:29 +00:00
|
|
|
/* Some universal constants... */
|
|
|
|
|
|
|
|
#define CHAR_BIT 8
|
|
|
|
#define SCHAR_MIN (-128)
|
|
|
|
#define SCHAR_MAX 127
|
|
|
|
#define UCHAR_MAX 255
|
2011-06-25 19:38:00 +00:00
|
|
|
#define SHRT_MIN (-1-0x7fff)
|
|
|
|
#define SHRT_MAX 0x7fff
|
|
|
|
#define USHRT_MAX 0xffff
|
|
|
|
#define INT_MIN (-1-0x7fffffff)
|
|
|
|
#define INT_MAX 0x7fffffff
|
|
|
|
#define UINT_MAX 0xffffffffU
|
|
|
|
#define LONG_MIN (-LONG_MAX-1)
|
|
|
|
#define ULONG_MAX (2UL*LONG_MAX+1)
|
|
|
|
#define LLONG_MIN (-LLONG_MAX-1)
|
|
|
|
#define ULLONG_MAX (2ULL*LLONG_MAX+1)
|
2011-02-12 05:22:29 +00:00
|
|
|
|
|
|
|
#define MB_LEN_MAX 4
|
2011-02-14 10:10:10 +00:00
|
|
|
|
|
|
|
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|
2012-11-26 17:05:33 +00:00
|
|
|
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
2011-02-14 10:10:10 +00:00
|
|
|
|
2011-06-25 19:38:00 +00:00
|
|
|
#define PIPE_BUF 4096
|
|
|
|
#define FILESIZEBITS 64
|
|
|
|
#define NAME_MAX 255
|
|
|
|
#define PATH_MAX 4096
|
|
|
|
#define NGROUPS_MAX 32
|
|
|
|
#define ARG_MAX 131072
|
|
|
|
#define IOV_MAX 1024
|
|
|
|
#define SYMLOOP_MAX 40
|
|
|
|
#define WORD_BIT 32
|
2011-02-14 10:10:10 +00:00
|
|
|
#define SSIZE_MAX LONG_MAX
|
2011-02-12 05:22:29 +00:00
|
|
|
#define TZNAME_MAX 6
|
2013-11-29 17:45:09 +00:00
|
|
|
#define TTY_NAME_MAX 32
|
2011-02-12 05:22:29 +00:00
|
|
|
#define HOST_NAME_MAX 255
|
|
|
|
|
|
|
|
/* Implementation choices... */
|
|
|
|
|
pthread stack treatment overhaul for application-provided stacks, etc.
the main goal of these changes is to address the case where an
application provides a stack of size N, but TLS has size M that's a
significant portion of the size N (or even larger than N), thus giving
the application less stack space than it expected or no stack at all!
the new strategy pthread_create now uses is to only put TLS on the
application-provided stack if TLS is smaller than 1/8 of the stack
size or 2k, whichever is smaller. this ensures that the application
always has "close enough" to what it requested, and the threshold is
chosen heuristically to make sure "sane" amounts of TLS still end up
in the application-provided stack.
if TLS does not fit the above criteria, pthread_create uses mmap to
obtain space for TLS, but still uses the application-provided stack
for actual call frame stack. this is to avoid wasting memory, and for
the sake of supporting ugly hacks like garbage collection based on
assumptions that the implementation will use the provided stack range.
in order for the above heuristics to ever succeed, the amount of TLS
space wasted on POSIX TSD (pthread_key_create based) needed to be
reduced. otherwise, these changes would preclude any use of
pthread_create without mmap, which would have serious memory usage and
performance costs for applications trying to create huge numbers of
threads using pre-allocated stack space. the new value of
PTHREAD_KEYS_MAX is the minimum allowed by POSIX, 128. this should
still be plenty more than real-world applications need, especially now
that C11/gcc-style TLS is now supported in musl, and most apps and
libraries choose to use that instead of POSIX TSD when available.
at the same time, PTHREAD_STACK_MIN has been decreased. it was
originally set to PAGE_SIZE back when there was no support for TLS or
application-provided stacks, and requests smaller than a whole page
did not make sense. now, there are two good reasons to support
requests smaller than a page: (1) applications could provide
pre-allocated stacks smaller than a page, and (2) with smaller stack
sizes, stack+TLS+TSD can all fit in one page, making it possible for
applications which need huge numbers of threads with minimal stack
needs to allocate exactly one page per thread. the new value of
PTHREAD_STACK_MIN, 2k, is aligned with the minimum size for
sigaltstack.
2013-02-02 03:10:40 +00:00
|
|
|
#define PTHREAD_KEYS_MAX 128
|
|
|
|
#define PTHREAD_STACK_MIN 2048
|
2011-02-14 00:58:30 +00:00
|
|
|
#define PTHREAD_DESTRUCTOR_ITERATIONS 4
|
2011-03-03 23:32:26 +00:00
|
|
|
#define SEM_VALUE_MAX 0x7fffffff
|
2011-03-11 02:34:19 +00:00
|
|
|
#define SEM_NSEMS_MAX 256
|
2011-03-29 17:01:25 +00:00
|
|
|
#define DELAYTIMER_MAX 0x7fffffff
|
2011-06-07 19:05:04 +00:00
|
|
|
#define MQ_PRIO_MAX 32768
|
2012-05-14 04:01:48 +00:00
|
|
|
#define LOGIN_NAME_MAX 256
|
2011-02-12 05:22:29 +00:00
|
|
|
|
|
|
|
/* Arbitrary numbers... */
|
|
|
|
|
|
|
|
#define BC_BASE_MAX 99
|
|
|
|
#define BC_DIM_MAX 2048
|
|
|
|
#define BC_SCALE_MAX 99
|
|
|
|
#define BC_STRING_MAX 1000
|
|
|
|
#define CHARCLASS_NAME_MAX 14
|
|
|
|
#define COLL_WEIGHTS_MAX 2
|
|
|
|
#define EXPR_NEST_MAX 32
|
|
|
|
#define LINE_MAX 4096
|
|
|
|
#define RE_DUP_MAX 255
|
|
|
|
|
|
|
|
#define NL_ARGMAX 9
|
|
|
|
#define NL_MSGMAX 32767
|
|
|
|
#define NL_SETMAX 255
|
|
|
|
#define NL_TEXTMAX 2048
|
|
|
|
|
2011-02-14 23:41:25 +00:00
|
|
|
#endif
|
|
|
|
|
2018-03-10 22:53:27 +00:00
|
|
|
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
|
|
|
|
|
|
|
|
#ifdef PAGESIZE
|
|
|
|
#define PAGE_SIZE PAGESIZE
|
|
|
|
#endif
|
|
|
|
#define NZERO 20
|
|
|
|
#define NL_LANGMAX 32
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2013-10-21 02:01:51 +00:00
|
|
|
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) \
|
|
|
|
|| (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
|
|
|
|
|
|
|
|
#define NL_NMAX 16
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2011-02-12 05:22:29 +00:00
|
|
|
/* POSIX/SUS requirements follow. These numbers come directly
|
|
|
|
* from SUS and have nothing to do with the host system. */
|
|
|
|
|
|
|
|
#define _POSIX_AIO_LISTIO_MAX 2
|
|
|
|
#define _POSIX_AIO_MAX 1
|
|
|
|
#define _POSIX_ARG_MAX 4096
|
|
|
|
#define _POSIX_CHILD_MAX 25
|
2011-02-14 23:41:25 +00:00
|
|
|
#define _POSIX_CLOCKRES_MIN 20000000
|
2011-02-12 05:22:29 +00:00
|
|
|
#define _POSIX_DELAYTIMER_MAX 32
|
|
|
|
#define _POSIX_HOST_NAME_MAX 255
|
|
|
|
#define _POSIX_LINK_MAX 8
|
|
|
|
#define _POSIX_LOGIN_NAME_MAX 9
|
|
|
|
#define _POSIX_MAX_CANON 255
|
|
|
|
#define _POSIX_MAX_INPUT 255
|
|
|
|
#define _POSIX_MQ_OPEN_MAX 8
|
|
|
|
#define _POSIX_MQ_PRIO_MAX 32
|
|
|
|
#define _POSIX_NAME_MAX 14
|
|
|
|
#define _POSIX_NGROUPS_MAX 8
|
|
|
|
#define _POSIX_OPEN_MAX 20
|
|
|
|
#define _POSIX_PATH_MAX 256
|
|
|
|
#define _POSIX_PIPE_BUF 512
|
|
|
|
#define _POSIX_RE_DUP_MAX 255
|
|
|
|
#define _POSIX_RTSIG_MAX 8
|
|
|
|
#define _POSIX_SEM_NSEMS_MAX 256
|
|
|
|
#define _POSIX_SEM_VALUE_MAX 32767
|
|
|
|
#define _POSIX_SIGQUEUE_MAX 32
|
|
|
|
#define _POSIX_SSIZE_MAX 32767
|
|
|
|
#define _POSIX_STREAM_MAX 8
|
|
|
|
#define _POSIX_SS_REPL_MAX 4
|
|
|
|
#define _POSIX_SYMLINK_MAX 255
|
|
|
|
#define _POSIX_SYMLOOP_MAX 8
|
|
|
|
#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
|
|
|
|
#define _POSIX_THREAD_KEYS_MAX 128
|
|
|
|
#define _POSIX_THREAD_THREADS_MAX 64
|
|
|
|
#define _POSIX_TIMER_MAX 32
|
|
|
|
#define _POSIX_TRACE_EVENT_NAME_MAX 30
|
|
|
|
#define _POSIX_TRACE_NAME_MAX 8
|
|
|
|
#define _POSIX_TRACE_SYS_MAX 8
|
|
|
|
#define _POSIX_TRACE_USER_EVENT_MAX 32
|
|
|
|
#define _POSIX_TTY_NAME_MAX 9
|
|
|
|
#define _POSIX_TZNAME_MAX 6
|
|
|
|
#define _POSIX2_BC_BASE_MAX 99
|
|
|
|
#define _POSIX2_BC_DIM_MAX 2048
|
|
|
|
#define _POSIX2_BC_SCALE_MAX 99
|
|
|
|
#define _POSIX2_BC_STRING_MAX 1000
|
|
|
|
#define _POSIX2_CHARCLASS_NAME_MAX 14
|
|
|
|
#define _POSIX2_COLL_WEIGHTS_MAX 2
|
|
|
|
#define _POSIX2_EXPR_NEST_MAX 32
|
|
|
|
#define _POSIX2_LINE_MAX 2048
|
|
|
|
#define _POSIX2_RE_DUP_MAX 255
|
|
|
|
|
|
|
|
#define _XOPEN_IOV_MAX 16
|
|
|
|
#define _XOPEN_NAME_MAX 255
|
|
|
|
#define _XOPEN_PATH_MAX 1024
|
|
|
|
|
|
|
|
#endif
|