From 59e3b6ca7dc10603d1e692928a236fe5a0523200 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 7 Feb 2007 17:22:40 +0000 Subject: [PATCH] * cygmalloc.h (MALLOC_FAILURE_ACTION): Define empty. * cygwin.din (posix_madvise): Export. (posix_memalign): Export. * fhandler.cc (fhandler_base::fpathconf): Return useful values in _PC_VDISABLE, _PC_SYNC_IO and _PC_SYMLINK_MAX cases. * malloc_wrapper.cc (malloc): Set errno here since it's not set in dlmalloc.c anymore. (realloc): Ditto. (calloc): Ditto. (memalign): Ditto. (valloc): Ditto. (posix_memalign): New function. * mmap.cc (posix_madvise): New function. * sysconf.cc (get_open_max): New function. (get_page_size): Ditto. (get_nproc_values): Ditto. (get_avphys): Ditto. (sc_type): New type. (sca): New array to map _SC_xxx options to sysconf return values. (sysconf): Reimplement using sca array. * include/limits.h: Add all missing values as defined by SUSv3. * include/pthread.h (PTHREAD_DESTRUCTOR_ITERATIONS): Move definition to sys/limits.h. (PTHREAD_KEYS_MAX): Ditto. * include/semaphore.h (SEM_VALUE_MAX): Ditto. * include/cygwin/stdlib.h (posix_memalign): Declare. * include/cygwin/version.h: Bump API minor number. * include/sys/mman.h: Add posix_madvise flags. (posix_madvise): Declare. * include/sys/termios.h (_POSIX_VDISABLE): Move definition to sys/limits.h. --- winsup/cygwin/ChangeLog | 34 +++ winsup/cygwin/cygmalloc.h | 3 +- winsup/cygwin/cygwin.din | 2 + winsup/cygwin/fhandler.cc | 10 +- winsup/cygwin/include/cygwin/stdlib.h | 3 +- winsup/cygwin/include/cygwin/version.h | 5 +- winsup/cygwin/include/limits.h | 248 ++++++++++++++--- winsup/cygwin/include/pthread.h | 8 +- winsup/cygwin/include/semaphore.h | 3 +- winsup/cygwin/include/sys/mman.h | 13 +- winsup/cygwin/include/sys/termios.h | 7 +- winsup/cygwin/malloc_wrapper.cc | 32 ++- winsup/cygwin/mmap.cc | 23 ++ winsup/cygwin/sysconf.cc | 351 ++++++++++++++++--------- 14 files changed, 563 insertions(+), 179 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c750a006c..a1d3fc85e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,37 @@ +2007-02-07 Corinna Vinschen + + * cygmalloc.h (MALLOC_FAILURE_ACTION): Define empty. + * cygwin.din (posix_madvise): Export. + (posix_memalign): Export. + * fhandler.cc (fhandler_base::fpathconf): Return useful values in + _PC_VDISABLE, _PC_SYNC_IO and _PC_SYMLINK_MAX cases. + * malloc_wrapper.cc (malloc): Set errno here since it's not set in + dlmalloc.c anymore. + (realloc): Ditto. + (calloc): Ditto. + (memalign): Ditto. + (valloc): Ditto. + (posix_memalign): New function. + * mmap.cc (posix_madvise): New function. + * sysconf.cc (get_open_max): New function. + (get_page_size): Ditto. + (get_nproc_values): Ditto. + (get_avphys): Ditto. + (sc_type): New type. + (sca): New array to map _SC_xxx options to sysconf return values. + (sysconf): Reimplement using sca array. + * include/limits.h: Add all missing values as defined by SUSv3. + * include/pthread.h (PTHREAD_DESTRUCTOR_ITERATIONS): Move definition + to sys/limits.h. + (PTHREAD_KEYS_MAX): Ditto. + * include/semaphore.h (SEM_VALUE_MAX): Ditto. + * include/cygwin/stdlib.h (posix_memalign): Declare. + * include/cygwin/version.h: Bump API minor number. + * include/sys/mman.h: Add posix_madvise flags. + (posix_madvise): Declare. + * include/sys/termios.h (_POSIX_VDISABLE): Move definition to + sys/limits.h. + 2007-02-05 Corinna Vinschen * fhandler_serial.cc (fhandler_serial::tcsetattr): Add support for diff --git a/winsup/cygwin/cygmalloc.h b/winsup/cygwin/cygmalloc.h index eeb7ff178..40a80d5b6 100644 --- a/winsup/cygwin/cygmalloc.h +++ b/winsup/cygwin/cygmalloc.h @@ -1,6 +1,6 @@ /* cygmalloc.h: cygwin DLL malloc stuff - Copyright 2002, 2003, 2004, 2005 Red Hat, Inc. + Copyright 2002, 2003, 2004, 2005, 2007 Red Hat, Inc. This file is part of Cygwin. @@ -25,6 +25,7 @@ void dlmalloc_stats (); #ifndef __INSIDE_CYGWIN__ # define USE_DL_PREFIX 1 #else +#define MALLOC_FAILURE_ACTION # define __malloc_lock() mallock.acquire () # define __malloc_unlock() mallock.release () extern muto mallock; diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 37e38dcf5..9fc024eef 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -988,6 +988,8 @@ popen SIGFE _popen = popen SIGFE posix_fadvise SIGFE posix_fallocate SIGFE +posix_madvise SIGFE +posix_memalign SIGFE posix_openpt SIGFE posix_regcomp SIGFE posix_regerror SIGFE diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index 7c51a6e3d..bf938e7a9 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -1852,19 +1852,21 @@ fhandler_base::fpathconf (int v) case _PC_NO_TRUNC: return 1; case _PC_VDISABLE: - if (!is_tty ()) - set_errno (EINVAL); + if (is_tty ()) + return _POSIX_VDISABLE; + set_errno (EINVAL); break; case _PC_ASYNC_IO: case _PC_PRIO_IO: - case _PC_SYNC_IO: break; + case _PC_SYNC_IO: + return 1; case _PC_FILESIZEBITS: return FILESIZEBITS; case _PC_2_SYMLINKS: return 1; case _PC_SYMLINK_MAX: - break; + return SYMLINK_MAX; case _PC_POSIX_PERMISSIONS: case _PC_POSIX_SECURITY: if (get_device () == FH_FS) diff --git a/winsup/cygwin/include/cygwin/stdlib.h b/winsup/cygwin/include/cygwin/stdlib.h index e034fe895..208a64e9e 100644 --- a/winsup/cygwin/include/cygwin/stdlib.h +++ b/winsup/cygwin/include/cygwin/stdlib.h @@ -1,6 +1,6 @@ /* stdlib.h - Copyright 2005, 2006 Red Hat Inc. + Copyright 2005, 2006, 2007 Red Hat Inc. This file is part of Cygwin. @@ -32,6 +32,7 @@ int unlockpt (int); #endif /*__STRICT_ANSI__*/ int posix_openpt (int); +int posix_memalign (void **, size_t, size_t); #ifdef _COMPILING_NEWLIB #define unsetenv UNUSED_unsetenv diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 44c7229c3..d015fade0 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -1,7 +1,7 @@ /* version.h -- Cygwin version numbers and accompanying documentation. Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Red Hat, Inc. + 2005, 2006, 2007 Red Hat, Inc. This file is part of Cygwin. @@ -301,12 +301,13 @@ details. */ 161: Export resolver functions. 162: New struct ifreq. Export if_nametoindex, if_indextoname, if_nameindex, if_freenameindex. + 163: Export posix_madvise, posix_memalign. */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 162 +#define CYGWIN_VERSION_API_MINOR 163 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/include/limits.h b/winsup/cygwin/include/limits.h index 3c4ac2b4b..260e63a53 100644 --- a/winsup/cygwin/include/limits.h +++ b/winsup/cygwin/include/limits.h @@ -1,6 +1,6 @@ /* limits.h - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. + Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc. This file is part of Cygwin. @@ -127,16 +127,46 @@ details. */ /* Runtime Invariant Values */ +/* Please note that symbolic names shall be ommited, on specific + implementations where the corresponding value is equal to or greater + than the stated minimum, but is unspecified. This indetermination + might depend on the amount of available memory space on a specific + instance of a specific implementation. The actual value supported by + a specific instance shall be provided by the sysconf() function. */ + +/* Maximum number of I/O operations in a single list I/O call supported by + the implementation. Not yet implemented. */ +#undef AIO_LISTIO_MAX +/* #define AIO_LISTIO_MAX >= _POSIX_AIO_LISTIO_MAX */ + +/* Maximum number of outstanding asynchronous I/O operations supported by + the implementation. Not yet implemented. */ +#undef AIO_MAX +/* #define AIO_MAX >= _POSIX_AIO_MAX */ + +/* The maximum amount by which a process can decrease its asynchronous I/O + priority level from its own scheduling priority. */ +#undef AIO_PRIO_DELTA_MAX +/* #define AIO_PRIO_DELTA_MAX >= 0 */ + /* Maximum number of bytes in arguments and environment passed in an exec call. 32000 is the safe value used for Windows processes when called from Cygwin processes. */ #undef ARG_MAX #define ARG_MAX 32000 +/* Maximum number of functions that may be registered with atexit(). */ +#undef ATEXIT_MAX +#define ATEXIT_MAX 32 + /* Maximum number of simultaneous processes per real user ID. */ #undef CHILD_MAX #define CHILD_MAX 256 +/* Maximum number of timer expiration overruns. Not yet implemented. */ +#undef DELAYTIMER_MAX +/* #define DELAYTIMER_MAX >= _POSIX_DELAYTIMER_MAX */ + /* Maximum length of a host name. */ #undef HOST_NAME_MAX #define HOST_NAME_MAX 255 @@ -149,6 +179,16 @@ details. */ #undef LOGIN_NAME_MAX #define LOGIN_NAME_MAX 256 /* equal to UNLEN defined in w32api/lmcons.h */ +/* The maximum number of open message queue descriptors a process may hold. + Not yet implemented. */ +#undef MQ_OPEN_MAX +/* #define MQ_OPEN_MAX >= _POSIX_MQ_OPEN_MAX */ + +/* The maximum number of message priorities supported by the implementation. + Not yet implemented. */ +#undef MQ_PRIO_MAX +/* #define MQ_PRIO_MAX >= _POSIX_MQ_PRIO_MAX */ + /* # of open files per process. Actually it can be more since Cygwin grows the dtable as necessary. We define a reasonable limit here which is returned by getdtablesize(), sysconf(_SC_OPEN_MAX) and @@ -162,11 +202,61 @@ details. */ #define PAGESIZE 65536 #define PAGE_SIZE PAGESIZE +/* Maximum number of attempts made to destroy a thread's thread-specific + data values on thread exit. */ +/* FIXME: I really don't understand this value. Why should multiple + attempts be necessary to destroy thread-specific data?!? Anyway, the + current value here is 1, taken originally from our pthread.h file, + where it was mistakenly defined first. Unfortunately this value is + lower than the POSIX defined minimum value, which is 4. */ +#undef PTHREAD_DESTRUCTOR_ITERATIONS +#define PTHREAD_DESTRUCTOR_ITERATIONS 1 + +/* Maximum number of data keys that can be created by a process. */ +/* Tls has 64 items for pre win2000 - and we don't want to use them all :] */ +#undef PTHREAD_KEYS_MAX +#define PTHREAD_KEYS_MAX 32 + +/* Minimum size in bytes of thread stack storage. */ +/* Actually the minimum stack size is somewhat of a split personality. + The size parameter in a CreateThread call is the size of the initially + commited stack size, which can be specified as low as 4K. However, the + default *reserved* stack size is 1 Meg, unless the .def file specifies + another STACKSIZE value. And even if you specify a stack size below 64K, + the allocation granularity is in the way. You can never squeeze multiple + threads in the same allocation granularity slot. Oh well. */ +#undef PTHREAD_STACK_MIN +#define PTHREAD_STACK_MIN 65536 + +/* Maximum number of threads that can be created per process. */ +/* Windows allows any arbitrary number of threads per process. */ +#undef PTHREAD_THREADS_MAX +/* #define PTHREAD_THREADS_MAX unspecified */ + /* Maximum number of realtime signals reserved for application use. */ /* FIXME: We only support one realtime signal but _POSIX_RTSIG_MAX is 8. */ #undef RTSIG_MAX #define RTSIG_MAX 1 +/* Maximum number of semaphores that a process may have. */ +/* Windows allows any arbitrary number of semaphores per process. */ +#undef SEM_NSEMS_MAX +/* #define SEM_NSEMS_MAX unspecified */ + +/* The maximum value a semaphore may have. */ +#undef SEM_VALUE_MAX +#define SEM_VALUE_MAX 1147483648 + +/* Maximum number of queued signals that a process may send and have pending + at the receiver(s) at any time. */ +#undef SIGQUEUE_MAX +#define SIGQUEUE_MAX 32 + +/* The maximum number of replenishment operations that may be simultaneously + pending for a particular sporadic server scheduler. Not implemented. */ +#undef SS_REPL_MAX +/* #define SS_REPL_MAX >= _POSIX_SS_REPL_MAX */ + /* Number of streams that one process can have open at one time. */ #undef STREAM_MAX #define STREAM_MAX 20 @@ -179,10 +269,34 @@ details. */ #undef TIMER_MAX #define TIMER_MAX 32 +/* Maximum length of the trace event name. Not implemented. */ +#undef TRACE_EVENT_NAME_MAX +/* #define TRACE_EVENT_NAME_MAX >= _POSIX_TRACE_EVENT_NAME_MAX */ + +/* Maximum length of the trace generation version string or of the trace + stream name. Not implemented. */ +#undef TRACE_NAME_MAX +/* #define TRACE_NAME_MAX >= _POSIX_TRACE_NAME_MAX */ + +/* Maximum number of trace streams that may simultaneously exist in the + system. Not implemented. */ +#undef TRACE_SYS_MAX +/* #define TRACE_SYS_MAX >= _POSIX_TRACE_SYS_MAX */ + +/* Maximum number of user trace event type identifiers that may simultaneously + exist in a traced process, including the predefined user trace event + POSIX_TRACE_UNNAMED_USER_EVENT. Not implemented. */ +#undef TRACE_USER_EVENT_MAX +/* #define TRACE_USER_EVENT_MAX >= _POSIX_TRACE_USER_EVENT_MAX */ + /* Maximum number of characters in a tty name. */ #undef TTY_NAME_MAX #define TTY_NAME_MAX 12 +/* Maximum number of bytes supported for the name of a timezone (not of the TZ variable). Not implemented. */ +#undef TZNAME_MAX +/* #define TZNAME_MAX >= _POSIX_TZNAME_MAX */ + /* Pathname Variable Values */ @@ -215,6 +329,33 @@ details. */ #undef PIPE_BUF #define PIPE_BUF 4096 +/* Minimum number of bytes of storage actually allocated for any portion + of a file. Not implemented. */ +#undef POSIX_ALLOC_SIZE_MIN +/* #define POSIX_ALLOC_SIZE_MIN unspecifed */ + +/* Recommended increment for file transfer sizes between the + {POSIX_REC_MIN_XFER_SIZE} and {POSIX_REC_MAX_XFER_SIZE} values. + Not implemented. */ +#undef POSIX_REC_INCR_XFER_SIZE +/* #define POSIX_REC_INCR_XFER_SIZE unspecifed */ + +/* Maximum recommended file transfer size. Not implemented. */ +#undef POSIX_REC_MAX_XFER_SIZE +/* #define POSIX_REC_MAX_XFER_SIZE unspecifed */ + +/* Minimum recommended file transfer size. Not implemented. */ +#undef POSIX_REC_MIN_XFER_SIZE +/* #define POSIX_REC_MIN_XFER_SIZE unspecifed */ + +/* Recommended file transfer buffer alignment. Not implemented. */ +#undef POSIX_REC_XFER_ALIGN +/* #define POSIX_REC_XFER_ALIGN unspecifed */ + +/* Maximum number of bytes in a symbolic link. */ +#undef SYMLINK_MAX +#define SYMLINK_MAX PATH_MAX + /* Runtime Increasable Values */ @@ -234,16 +375,18 @@ details. */ #undef BC_STRING_MAX #define BC_STRING_MAX 1000 +/* Maximum number of bytes in a character class name. Not implemented. */ +#undef CHARCLASS_NAME_MAX +/* #define CHARCLASS_NAME_MAX >= _POSIX2_CHARCLASS_NAME_MAX */ + /* Maximum number of weights that can be assigned to an entry of the LC_COLLATE order keyword in the locale definition file. */ /* FIXME: We don't support this at all right now, so this value is misleading at best. It's also lower than _POSIX2_COLL_WEIGHTS_MAX which is not good. So, for now we deliberately not define it even though it was defined in the former syslimits.h file. */ -#if 0 #undef COLL_WEIGHTS_MAX -#define COLL_WEIGHTS_MAX 0 -#endif +/* #define COLL_WEIGHTS_MAX >= _POSIX2_COLL_WEIGHTS_MAX */ /* Maximum number of expressions that can be nested within parentheses by the expr utility. */ @@ -265,51 +408,80 @@ details. */ #define RE_DUP_MAX 255 -/* Minimum Values */ - /* POSIX values */ /* These should never vary from one system type to another */ /* They represent the minimum values that POSIX systems must support. POSIX-conforming apps must not require larger values. */ -#define _POSIX_ARG_MAX 4096 -#define _POSIX_CHILD_MAX 6 -#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_NAME_MAX 14 -#define _POSIX_NGROUPS_MAX 0 -#define _POSIX_OPEN_MAX 16 -#define _POSIX_PATH_MAX 255 -#define _POSIX_PIPE_BUF 512 -#define _POSIX_RE_DUP_MAX 255 -#define _POSIX_RTSIG_MAX 8 -#define _POSIX_SSIZE_MAX 32767 -#define _POSIX_STREAM_MAX 8 -#define _POSIX_SYMLINK_MAX 255 -#define _POSIX_SYMLOOP_MAX 8 -#define _POSIX_TIMER_MAX 32 -#define _POSIX_TTY_NAME_MAX 9 -#define _POSIX_TZNAME_MAX 3 -#define _POSIX2_BC_BASE_MAX 99 -#define _POSIX2_BC_DIM_MAX 2048 -#define _POSIX2_BC_SCALE_MAX 99 -#define _POSIX2_BC_STRING_MAX 1000 -#if 0 /* See comment about COLL_WEIGHTS_MAX above. */ -#define _POSIX2_COLL_WEIGHTS_MAX 2 -#endif -#define _POSIX2_EXPR_NEST_MAX 32 -#define _POSIX2_LINE_MAX 2048 -#define _POSIX2_RE_DUP_MAX 255 +/* Maximum Values */ +#define _POSIX_CLOCKRES_MIN 20000000 + +/* Minimum Values */ + +#define _POSIX_AIO_LISTIO_MAX 2 +#define _POSIX_AIO_MAX 1 +#define _POSIX_ARG_MAX 4096 +#define _POSIX_CHILD_MAX 25 +#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_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 /* Other Invariant Values */ +#define NL_ARGMAX 9 +#define NL_LANGMAX 14 +#define NL_MSGMAX 32767 +#define NL_NMAX INT_MAX +#define NL_SETMAX 255 +#define NL_TEXTMAX _POSIX2_LINE_MAX + /* Default process priority. */ #undef NZERO -#define NZERO 20 +#define NZERO 20 #endif /* _MACH_MACHLIMITS_H_ */ #endif /* _LIMITS_H___ */ diff --git a/winsup/cygwin/include/pthread.h b/winsup/cygwin/include/pthread.h index 8a475a60e..73759ddc0 100644 --- a/winsup/cygwin/include/pthread.h +++ b/winsup/cygwin/include/pthread.h @@ -1,6 +1,7 @@ /* pthread.h: POSIX pthread interface - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2006 Red Hat, Inc. + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2006, + 2007 Red Hat, Inc. Written by Marco Fuykschot @@ -30,11 +31,6 @@ extern "C" would normally be written to the passed parameter of pthread_cond_init(lvalue, NULL); */ /* #define PTHREAD_COND_INITIALIZER 0 */ -#define PTHREAD_DESTRUCTOR_ITERATIONS 1 -/* Tls has 64 items for pre win2000 - and we don't want to use them all :] - * Before committing discuss this with the list - */ -#define PTHREAD_KEYS_MAX 32 /* the default : joinable */ #define PTHREAD_CANCEL_ASYNCHRONOUS 1 diff --git a/winsup/cygwin/include/semaphore.h b/winsup/cygwin/include/semaphore.h index 96f7c6f88..0f13c85e8 100644 --- a/winsup/cygwin/include/semaphore.h +++ b/winsup/cygwin/include/semaphore.h @@ -1,6 +1,6 @@ /* semaphore.h: POSIX semaphore interface - Copyright 2001, 2003 Red Hat, Inc. + Copyright 2001, 2003, 2007 Red Hat, Inc. Written by Robert Collins @@ -25,7 +25,6 @@ extern "C" #endif #define SEM_FAILED 0 -#define SEM_VALUE_MAX 1147483648 /* Semaphores */ int sem_init (sem_t * sem, int pshared, unsigned int value); diff --git a/winsup/cygwin/include/sys/mman.h b/winsup/cygwin/include/sys/mman.h index f501b7b75..a3c8077b0 100644 --- a/winsup/cygwin/include/sys/mman.h +++ b/winsup/cygwin/include/sys/mman.h @@ -1,6 +1,6 @@ /* sys/mman.h - Copyright 1996, 1997, 1998, 2000, 2001 Red Hat, Inc. + Copyright 1996, 1997, 1998, 2000, 2001, 2003, 2005, 2007 Red Hat, Inc. This file is part of Cygwin. @@ -47,6 +47,15 @@ extern "C" { #define MS_SYNC 2 #define MS_INVALIDATE 4 +/* + * Flags for posix_madvise. + */ +#define POSIX_MADV_NORMAL 0 +#define POSIX_MADV_SEQUENTIAL 1 +#define POSIX_MADV_RANDOM 2 +#define POSIX_MADV_WILLNEED 3 +#define POSIX_MADV_DONTNEED 4 + #ifndef __INSIDE_CYGWIN__ extern void *mmap (void *__addr, size_t __len, int __prot, int __flags, int __fd, off_t __off); #endif @@ -56,6 +65,8 @@ extern int msync (void *__addr, size_t __len, int __flags); extern int mlock (const void *__addr, size_t __len); extern int munlock (const void *__addr, size_t __len); +extern int posix_madvise (void *__addr, size_t __len, int __advice); + #ifdef __cplusplus }; #endif /* __cplusplus */ diff --git a/winsup/cygwin/include/sys/termios.h b/winsup/cygwin/include/sys/termios.h index e2fd1321a..057146966 100644 --- a/winsup/cygwin/include/sys/termios.h +++ b/winsup/cygwin/include/sys/termios.h @@ -1,6 +1,7 @@ /* sys/termios.h - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006 Red Hat, Inc. + Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, + 2007 Red Hat, Inc. This file is part of Cygwin. @@ -233,10 +234,6 @@ POSIX commands */ #define NCCS 18 -/* `c_cc' member of 'struct termios' structure can be disabled by - using the value _POSIX_VDISABLE. */ -#define _POSIX_VDISABLE '\0' - /* Compare a character C to a value VAL from the `c_cc' array in a `struct termios'. If VAL is _POSIX_VDISABLE, no character can match it. */ #define CCEQ(val, c) ((c) == (val) && (val) != _POSIX_VDISABLE) diff --git a/winsup/cygwin/malloc_wrapper.cc b/winsup/cygwin/malloc_wrapper.cc index 90689ffee..086c43d36 100644 --- a/winsup/cygwin/malloc_wrapper.cc +++ b/winsup/cygwin/malloc_wrapper.cc @@ -1,7 +1,7 @@ /* malloc_wrapper.cc - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Red Hat, Inc. + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006, 2007 Red Hat, Inc. Originally written by Steve Chamberlain of Cygnus Support sac@cygnus.com @@ -70,6 +70,8 @@ malloc (size_t size) __malloc_unlock (); } malloc_printf ("(%d) = %x, called by %p", size, res, __builtin_return_address (0)); + if (!res) + set_errno (ENOMEM); return res; } @@ -86,6 +88,8 @@ realloc (void *p, size_t size) __malloc_unlock (); } malloc_printf ("(%x, %d) = %x, called by %x", p, size, res, __builtin_return_address (0)); + if (!res) + set_errno (ENOMEM); return res; } @@ -102,9 +106,29 @@ calloc (size_t nmemb, size_t size) __malloc_unlock (); } malloc_printf ("(%d, %d) = %x, called by %x", nmemb, size, res, __builtin_return_address (0)); + if (!res) + set_errno (ENOMEM); return res; } +extern "C" int +posix_memalign (void **memptr, size_t alignment, size_t bytes) +{ + void *res; + if (!use_internal_malloc) + return ENOSYS; + if ((alignment & (alignment - 1)) != 0) + return EINVAL; + __malloc_lock (); + res = dlmemalign (alignment, bytes); + __malloc_unlock (); + if (!res) + return ENOMEM; + if (memptr) + *memptr = res; + return 0; +} + extern "C" void * memalign (size_t alignment, size_t bytes) { @@ -119,6 +143,8 @@ memalign (size_t alignment, size_t bytes) __malloc_lock (); res = dlmemalign (alignment, bytes); __malloc_unlock (); + if (!res) + set_errno (ENOMEM); } return res; @@ -138,6 +164,8 @@ valloc (size_t bytes) __malloc_lock (); res = dlvalloc (bytes); __malloc_unlock (); + if (!res) + set_errno (ENOMEM); } return res; diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc index 3c1552f81..309620a90 100644 --- a/winsup/cygwin/mmap.cc +++ b/winsup/cygwin/mmap.cc @@ -1650,6 +1650,29 @@ munlock (const void *addr, size_t len) return ret; } +extern "C" int +posix_madvise (void *addr, size_t len, int advice) +{ + /* Check parameters. */ + if (advice < POSIX_MADV_NORMAL || advice > POSIX_MADV_DONTNEED + || !len) + return EINVAL; + + /* Check requested memory area. */ + MEMORY_BASIC_INFORMATION m; + char *p = (char *) addr; + char *endp = p + len; + while (p < endp) + { + if (!VirtualQuery (p, &m, sizeof m) || m.State == MEM_FREE) + return ENOMEM; + p = (char *) m.BaseAddress + m.RegionSize; + } + + /* Eventually do nothing. */ + return 0; +} + /* * Base implementation: * diff --git a/winsup/cygwin/sysconf.cc b/winsup/cygwin/sysconf.cc index 343fb49e4..04f03f78e 100644 --- a/winsup/cygwin/sysconf.cc +++ b/winsup/cygwin/sysconf.cc @@ -1,7 +1,7 @@ /* sysconf.cc Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. + 2006, 2007 Red Hat, Inc. This file is part of Cygwin. @@ -22,131 +22,248 @@ details. */ #include "cygheap.h" #include "ntdll.h" +static long +get_open_max (int in) +{ + long max = getdtablesize (); + if (max < OPEN_MAX) + max = OPEN_MAX; + return max; +} + +static long +get_page_size (int in) +{ + return getpagesize (); +} + +static long +get_nproc_values (int in) +{ + switch (in) + { + case _SC_NPROCESSORS_CONF: + case _SC_NPROCESSORS_ONLN: + if (!wincap.supports_smp ()) + return 1; + /*FALLTHRU*/ + case _SC_PHYS_PAGES: + if (wincap.supports_smp ()) + { + NTSTATUS ret; + SYSTEM_BASIC_INFORMATION sbi; + if ((ret = NtQuerySystemInformation (SystemBasicInformation, + (PVOID) &sbi, + sizeof sbi, NULL)) + != STATUS_SUCCESS) + { + __seterrno_from_nt_status (ret); + debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E", + ret); + return -1; + } + switch (in) + { + case _SC_NPROCESSORS_CONF: + return sbi.NumberProcessors; + case _SC_NPROCESSORS_ONLN: + { + int i = 0; + do + if (sbi.ActiveProcessors & 1) + i++; + while (sbi.ActiveProcessors >>= 1); + return i; + } + case _SC_PHYS_PAGES: + return sbi.NumberOfPhysicalPages + / (getpagesize () / getsystempagesize ()); + } + } + } + return -1; +} + +static long +get_avphys (int in) +{ + if (wincap.supports_smp ()) + { + NTSTATUS ret; + SYSTEM_PERFORMANCE_INFORMATION spi; + if ((ret = NtQuerySystemInformation (SystemPerformanceInformation, + (PVOID) &spi, + sizeof spi, NULL)) + != STATUS_SUCCESS) + { + __seterrno_from_nt_status (ret); + debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E", + ret); + return -1; + } + return spi.AvailablePages / (getpagesize () / getsystempagesize ()); + } + return -1; +} + +enum sc_type { nsup, cons, func }; + +static struct +{ + sc_type type; + union + { + long c; + long (*f)(int); + }; +} sca[] = +{ + {cons, {c:ARG_MAX}}, /* 0, _SC_ARG_MAX */ + {cons, {c:CHILD_MAX}}, /* 1, _SC_CHILD_MAX */ + {cons, {c:CLOCKS_PER_SEC}}, /* 2, _SC_CLK_TCK */ + {cons, {c:NGROUPS_MAX}}, /* 3, _SC_NGROUPS_MAX */ + {func, {f:get_open_max}}, /* 4, _SC_OPEN_MAX */ + {cons, {c:_POSIX_JOB_CONTROL}}, /* 5, _SC_JOB_CONTROL */ + {cons, {c:_POSIX_SAVED_IDS}}, /* 6, _SC_SAVED_IDS */ + {cons, {c:_POSIX_VERSION}}, /* 7, _SC_VERSION */ + {func, {f:get_page_size}}, /* 8, _SC_PAGESIZE */ + {func, {f:get_nproc_values}}, /* 9, _SC_NPROCESSORS_CONF */ + {func, {f:get_nproc_values}}, /* 10, _SC_NPROCESSORS_ONLN */ + {func, {f:get_nproc_values}}, /* 11, _SC_PHYS_PAGES */ + {func, {f:get_avphys}}, /* 12, _SC_AVPHYS_PAGES */ + {nsup, {c:0}}, /* 13, _SC_MQ_OPEN_MAX */ + {nsup, {c:0}}, /* 14, _SC_MQ_PRIO_MAX */ + {cons, {c:RTSIG_MAX}}, /* 15, _SC_RTSIG_MAX */ + {cons, {c:-1L}}, /* 16, _SC_SEM_NSEMS_MAX */ + {cons, {c:SEM_VALUE_MAX}}, /* 17, _SC_SEM_VALUE_MAX */ + {cons, {c:SIGQUEUE_MAX}}, /* 18, _SC_SIGQUEUE_MAX */ + {cons, {c:TIMER_MAX}}, /* 19, _SC_TIMER_MAX */ + {nsup, {c:0}}, /* 20, _SC_TZNAME_MAX */ + {cons, {c:-1L}}, /* 21, _SC_ASYNCHRONOUS_IO */ + {cons, {c:_POSIX_FSYNC}}, /* 22, _SC_FSYNC */ + {cons, {c:_POSIX_MAPPED_FILES}}, /* 23, _SC_MAPPED_FILES */ + {cons, {c:-1L}}, /* 24, _SC_MEMLOCK */ + {cons, {c:_POSIX_MEMLOCK_RANGE}}, /* 25, _SC_MEMLOCK_RANGE */ + {cons, {c:_POSIX_MEMORY_PROTECTION}}, /* 26, _SC_MEMORY_PROTECTION */ + {cons, {c:-1L}}, /* 27, _SC_MESSAGE_PASSING */ + {cons, {c:-1L}}, /* 28, _SC_PRIORITIZED_IO */ + {cons, {c:_POSIX_REALTIME_SIGNALS}}, /* 29, _SC_REALTIME_SIGNALS */ + {cons, {c:_POSIX_SEMAPHORES}}, /* 30, _SC_SEMAPHORES */ + {cons, {c:-1L}}, /* 31, _SC_SHARED_MEMORY_OBJECTS */ + {cons, {c:_POSIX_SYNCHRONIZED_IO}}, /* 32, _SC_SYNCHRONIZED_IO */ + {cons, {c:_POSIX_TIMERS}}, /* 33, _SC_TIMERS */ + {nsup, {c:0}}, /* 34, _SC_AIO_LISTIO_MAX */ + {nsup, {c:0}}, /* 35, _SC_AIO_MAX */ + {nsup, {c:0}}, /* 36, _SC_AIO_PRIO_DELTA_MAX */ + {nsup, {c:0}}, /* 37, _SC_DELAYTIMER_MAX */ + {cons, {c:PTHREAD_KEYS_MAX}}, /* 38, _SC_THREAD_KEYS_MAX */ + {cons, {c:PTHREAD_STACK_MIN}}, /* 39, _SC_THREAD_STACK_MIN */ + {cons, {c:-1L}}, /* 40, _SC_THREAD_THREADS_MAX */ + {cons, {c:TTY_NAME_MAX}}, /* 41, _SC_TTY_NAME_MAX */ + {cons, {c:_POSIX_THREADS}}, /* 42, _SC_THREADS */ + {cons, {c:-1L}}, /* 43, _SC_THREAD_ATTR_STACKADDR */ + {cons, {c:_POSIX_THREAD_ATTR_STACKSIZE}}, /* 44, _SC_THREAD_ATTR_STACKSIZE */ + {cons, {c:_POSIX_THREAD_PRIORITY_SCHEDULING}}, /* 45, _SC_THREAD_PRIORITY_SCHEDULING */ + {cons, {c:-1L}}, /* 46, _SC_THREAD_PRIO_INHERIT */ + {cons, {c:-1L}}, /* 47, _SC_THREAD_PRIO_PROTECT */ + {cons, {c:_POSIX_THREAD_PROCESS_SHARED}}, /* 48, _SC_THREAD_PROCESS_SHARED */ + {cons, {c:_POSIX_THREAD_SAFE_FUNCTIONS}}, /* 49, _SC_THREAD_SAFE_FUNCTIONS */ + {cons, {c:16384L}}, /* 50, _SC_GETGR_R_SIZE_MAX */ + {cons, {c:16384L}}, /* 51, _SC_GETPW_R_SIZE_MAX */ + {cons, {c:LOGIN_NAME_MAX}}, /* 52, _SC_LOGIN_NAME_MAX */ + {cons, {c:PTHREAD_DESTRUCTOR_ITERATIONS}}, /* 53, _SC_THREAD_DESTRUCTOR_ITERATIONS */ + {cons, {c:_POSIX_ADVISORY_INFO}}, /* 54, _SC_ADVISORY_INFO */ + {cons, {c:ATEXIT_MAX}}, /* 55, _SC_ATEXIT_MAX */ + {cons, {c:-1L}}, /* 56, _SC_BARRIERS */ + {cons, {c:BC_BASE_MAX}}, /* 57, _SC_BC_BASE_MAX */ + {cons, {c:BC_DIM_MAX}}, /* 58, _SC_BC_DIM_MAX */ + {cons, {c:BC_SCALE_MAX}}, /* 59, _SC_BC_SCALE_MAX */ + {cons, {c:BC_STRING_MAX}}, /* 60, _SC_BC_STRING_MAX */ + {cons, {c:-1L}}, /* 61, _SC_CLOCK_SELECTION */ + {nsup, {c:0}}, /* 62, _SC_COLL_WEIGHTS_MAX */ + {cons, {c:-1L}}, /* 63, _SC_CPUTIME */ + {cons, {c:EXPR_NEST_MAX}}, /* 64, _SC_EXPR_NEST_MAX */ + {cons, {c:HOST_NAME_MAX}}, /* 65, _SC_HOST_NAME_MAX */ + {cons, {c:IOV_MAX}}, /* 66, _SC_IOV_MAX */ + {cons, {c:_POSIX_IPV6}}, /* 67, _SC_IPV6 */ + {cons, {c:LINE_MAX}}, /* 68, _SC_LINE_MAX */ + {cons, {c:-1L}}, /* 69, _SC_MONOTONIC_CLOCK */ + {cons, {c:_POSIX_RAW_SOCKETS}}, /* 70, _SC_RAW_SOCKETS */ + {cons, {c:_POSIX_READER_WRITER_LOCKS}}, /* 71, _SC_READER_WRITER_LOCKS */ + {cons, {c:_POSIX_REGEXP}}, /* 72, _SC_REGEXP */ + {cons, {c:RE_DUP_MAX}}, /* 73, _SC_RE_DUP_MAX */ + {cons, {c:_POSIX_SHELL}}, /* 74, _SC_SHELL */ + {cons, {c:-1L}}, /* 75, _SC_SPAWN */ + {cons, {c:-1L}}, /* 76, _SC_SPIN_LOCKS */ + {cons, {c:-1L}}, /* 77, _SC_SPORADIC_SERVER */ + {nsup, {c:0}}, /* 78, _SC_SS_REPL_MAX */ + {cons, {c:SYMLOOP_MAX}}, /* 79, _SC_SYMLOOP_MAX */ + {cons, {c:-1L}}, /* 80, _SC_THREAD_CPUTIME */ + {cons, {c:-1L}}, /* 81, _SC_THREAD_SPORADIC_SERVER */ + {cons, {c:-1L}}, /* 82, _SC_TIMEOUTS */ + {cons, {c:-1L}}, /* 83, _SC_TRACE */ + {cons, {c:-1L}}, /* 84, _SC_TRACE_EVENT_FILTER */ + {nsup, {c:0}}, /* 85, _SC_TRACE_EVENT_NAME_MAX */ + {cons, {c:-1L}}, /* 86, _SC_TRACE_INHERIT */ + {cons, {c:-1L}}, /* 87, _SC_TRACE_LOG */ + {nsup, {c:0}}, /* 88, _SC_TRACE_NAME_MAX */ + {nsup, {c:0}}, /* 89, _SC_TRACE_SYS_MAX */ + {nsup, {c:0}}, /* 90, _SC_TRACE_USER_EVENT_MAX */ + {cons, {c:-1L}}, /* 91, _SC_TYPED_MEMORY_OBJECTS */ + {cons, {c:-1L}}, /* 92, _SC_V6_ILP32_OFF32 */ + {cons, {c:_POSIX_V6_ILP32_OFFBIG}}, /* 93, _SC_V6_ILP32_OFFBIG */ + {cons, {c:-1L}}, /* 94, _SC_V6_LP64_OFF64 */ + {cons, {c:-1L}}, /* 95, _SC_V6_LPBIG_OFFBIG */ + {cons, {c:_XOPEN_CRYPT}}, /* 96, _SC_XOPEN_CRYPT */ + {cons, {c:_XOPEN_ENH_I18N}}, /* 97, _SC_XOPEN_ENH_I18N */ + {cons, {c:-1L}}, /* 98, _SC_XOPEN_LEGACY */ + {cons, {c:-1L}}, /* 99, _SC_XOPEN_REALTIME */ + {cons, {c:STREAM_MAX}}, /* 100, _SC_STREAM_MAX */ + {cons, {c:_POSIX_PRIORITY_SCHEDULING}}, /* 101, _SC_PRIORITY_SCHEDULING */ + {cons, {c:-1L}}, /* 102, _SC_XOPEN_REALTIME_THREADS */ + {cons, {c:_XOPEN_SHM}}, /* 103, _SC_XOPEN_SHM */ + {cons, {c:-1L}}, /* 104, _SC_XOPEN_STREAMS */ + {cons, {c:-1L}}, /* 105, _SC_XOPEN_UNIX */ + {cons, {c:_XOPEN_VERSION}}, /* 106, _SC_XOPEN_VERSION */ + {cons, {c:_POSIX2_CHAR_TERM}}, /* 107, _SC_2_CHAR_TERM */ + {cons, {c:_POSIX2_C_BIND}}, /* 108, _SC_2_C_BIND */ + {cons, {c:_POSIX2_C_BIND}}, /* 109, _SC_2_C_DEV */ + {cons, {c:-1L}}, /* 110, _SC_2_FORT_DEV */ + {cons, {c:-1L}}, /* 111, _SC_2_FORT_RUN */ + {cons, {c:-1L}}, /* 112, _SC_2_LOCALEDEF */ + {cons, {c:-1L}}, /* 113, _SC_2_PBS */ + {cons, {c:-1L}}, /* 114, _SC_2_PBS_ACCOUNTING */ + {cons, {c:-1L}}, /* 115, _SC_2_PBS_CHECKPOINT */ + {cons, {c:-1L}}, /* 116, _SC_2_PBS_LOCATE */ + {cons, {c:-1L}}, /* 117, _SC_2_PBS_MESSAGE */ + {cons, {c:-1L}}, /* 118, _SC_2_PBS_TRACK */ + {cons, {c:_POSIX2_SW_DEV}}, /* 119, _SC_2_SW_DEV */ + {cons, {c:_POSIX2_UPE}}, /* 120, _SC_2_UPE */ + {cons, {c:_POSIX2_VERSION}}, /* 121, _SC_2_VERSION */ +}; + +#define SC_MIN _SC_ARG_MAX +#define SC_MAX _SC_2_VERSION + /* sysconf: POSIX 4.8.1.1 */ /* Allows a portable app to determine quantities of resources or presence of an option at execution time. */ long int sysconf (int in) { - switch (in) + if (in >= SC_MIN && in <= SC_MAX) { - /* Keep order as in sys/unistd.h */ - case _SC_ARG_MAX: - /* FIXME: what's the right value? _POSIX_ARG_MAX is only 4K. - FIXME: Wouldn't it be more correct to return ARG_MAX here? */ - return 1048576; - case _SC_CHILD_MAX: - return CHILD_MAX; - case _SC_CLK_TCK: - return CLOCKS_PER_SEC; - case _SC_NGROUPS_MAX: - return NGROUPS_MAX; - case _SC_OPEN_MAX: + switch (sca[in].type) { - long max = getdtablesize (); - if (max < OPEN_MAX) - max = OPEN_MAX; - return max; + case nsup: + break; + case cons: + return sca[in].c; + case func: + return sca[in].f (in); } - case _SC_JOB_CONTROL: - return _POSIX_JOB_CONTROL; - case _SC_SAVED_IDS: - return _POSIX_SAVED_IDS; - case _SC_VERSION: - return _POSIX_VERSION; - case _SC_PAGESIZE: - return getpagesize (); - case _SC_NPROCESSORS_CONF: - case _SC_NPROCESSORS_ONLN: - if (!wincap.supports_smp ()) - return 1; - /*FALLTHRU*/ - case _SC_PHYS_PAGES: - if (wincap.supports_smp ()) - { - NTSTATUS ret; - SYSTEM_BASIC_INFORMATION sbi; - if ((ret = NtQuerySystemInformation (SystemBasicInformation, - (PVOID) &sbi, - sizeof sbi, NULL)) - != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E", - ret); - return -1; - } - switch (in) - { - case _SC_NPROCESSORS_CONF: - return sbi.NumberProcessors; - case _SC_NPROCESSORS_ONLN: - { - int i = 0; - do - if (sbi.ActiveProcessors & 1) - i++; - while (sbi.ActiveProcessors >>= 1); - return i; - } - case _SC_PHYS_PAGES: - return sbi.NumberOfPhysicalPages; - } - } - break; - case _SC_AVPHYS_PAGES: - if (wincap.supports_smp ()) - { - NTSTATUS ret; - SYSTEM_PERFORMANCE_INFORMATION spi; - if ((ret = NtQuerySystemInformation (SystemPerformanceInformation, - (PVOID) &spi, - sizeof spi, NULL)) - != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E", - ret); - return -1; - } - return spi.AvailablePages; - } - case _SC_RTSIG_MAX: - return RTSIG_MAX; - case _SC_TIMER_MAX: - return TIMER_MAX; -#if 0 /* FIXME -- unimplemented */ - case _SC_TZNAME_MAX: - return _POSIX_TZNAME_MAX; -#endif - case _SC_MEMLOCK_RANGE: - return _POSIX_MEMLOCK_RANGE; - case _SC_SEMAPHORES: - return _POSIX_SEMAPHORES; - case _SC_TIMERS: - return _POSIX_TIMERS; - case _SC_TTY_NAME_MAX: - return TTY_NAME_MAX; - case _SC_THREADS: - return _POSIX_THREADS; - case _SC_THREAD_ATTR_STACKSIZE: - return _POSIX_THREAD_ATTR_STACKSIZE; - case _SC_THREAD_PRIORITY_SCHEDULING: - return _POSIX_THREAD_PRIORITY_SCHEDULING; - case _SC_THREAD_PROCESS_SHARED: - return _POSIX_THREAD_PROCESS_SHARED; - case _SC_THREAD_SAFE_FUNCTIONS: - return _POSIX_THREAD_SAFE_FUNCTIONS; - case _SC_GETPW_R_SIZE_MAX: - case _SC_GETGR_R_SIZE_MAX: - return 16*1024; - case _SC_LOGIN_NAME_MAX: - return LOGIN_NAME_MAX; - case _SC_STREAM_MAX: - return STREAM_MAX; } - - /* Invalid input or unimplemented sysconf name */ + /* Unimplemented sysconf name or invalid option value. */ set_errno (EINVAL); - return -1; + return -1L; }