* 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.
This commit is contained in:
Corinna Vinschen 2007-02-07 17:22:40 +00:00
parent 0e37a2e6e5
commit 59e3b6ca7d
14 changed files with 563 additions and 179 deletions

View File

@ -1,3 +1,37 @@
2007-02-07 Corinna Vinschen <corinna@vinschen.de>
* 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 <corinna@vinschen.de>
* fhandler_serial.cc (fhandler_serial::tcsetattr): Add support for

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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___ */

View File

@ -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 <marco@ddi.nl>
@ -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

View File

@ -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 <rbtcollins@hotmail.com>
@ -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);

View File

@ -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 */

View File

@ -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)

View File

@ -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;

View File

@ -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:
*

View File

@ -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;
}