4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-21 16:26:12 +08:00

* exceptions.cc (set_signal_mask): Redefine to not pass by address. Report

calculated mask in debugging output.
* sigproc.h (set_signal_mask): Reflect above change in declaration.
* path.cc (mount_item::build_win32): Take path apart before feeding it to
fnmunge.  Throughout, change use of _reent_winsup()-> to _my_tls.locals.
instead.  Throughout, remove obsolete MT_SAFE/_CYG_THREAD_FAILSAFE
considerations.  Througout, add cygtls.h include.
* Makefile.in (DLL_OFILES): Add cygtls.o.  Add some more objects to the
-fomit-frame-pointer list.
* acconfig.h: Remove obsolete settings.
* config.h.in: Ditto.
* bsdlib.cc: Add cygtls.h include.
* configure.in: Remove --enable-extra-threadsafe-checking.
* configure: Regenerate.
* cygtls.h (_local_storage): New struct renamed from _winsup_t (sic).
(_threadinfo:local_clib): Add new field.
(_threadinfo::locals): Ditto.
(_threadinfo::init_thread): Accept second _reent * argument.
(_threadinfo::call): Define as regparm.
(CYGTLS_PADSIZE): Remove unnecessary slop.
(_getreent): Define as a macro.
* thread.h: Remove _CYG_THREAD_FAILSAFE and MT_SAFE stuff.
(_winsup_t): Move to cygtls.h.
(ResourceLocks::ResourceLocks): Eliminate empty constructor.
(MTinterface::reents): Eliminate.
(MTinterface::thread_self_key): Eliminate.
(MTinterface::MTinterface): Eliminate.
* dcrt0.cc: Include stdio.h for _impure_ptr initialization.
(do_global_ctors): Remove run_ctors_p (sic) considerations.  Don't call atexit
here.
(__main): Initialize destructors for user here.
(dll_crt0_1): Accept a dummy argument.  Don't call init_thread here.  Don't set
_impure_ptr here.  Call do_global_ctors after more things have been
initialized.
(_dll_crt0): Define zeros buffer as max of needed size of CYGTLS_PADSIZE so
that it can be used for two purposes while minimizing stack usage.  Initialize
_impure_ptr specifically, for speed.  Call dll_crt0_1 with buffer argument.
(cygwin_dll_init): Call dll_crt0_1 with dummy argument.
* dtable.cc (dtable::find_unused_handle): Remove call to AssertResourceOwner.
* exceptions.cc: Move _threadinfo stuff to new file.
* cygtls.cc: New file.
* gentls_offsets: Accommodate increasing complexity of cygtls.h.
* hires.h (hires_base::~hires_base): Remove.
* init.cc (dll_entry): Remove setting of reents.
* thread.cc: Remove syslog.h include.
(__getreent): Simplify to use _my_tls.
(_reent_winsup): Delete.
(AssertResourceOwner): Delete.
(MTinterface::Init): Remove setting of _clib and _winsup, with all that
entails.
(MTinterface::fixup_after_fork): Ditto.
(pthread::thread_init_wrapper): Ditto.  Also remove call to
set_tls_self_pointer.
(pthread::set_tls_self_pointer): Eliminate.
(pthread::get_tls_self_pointer): Just return _my_tls.tid;
(__reent_t::init_clib): Eliminate.
* tlsoffsets.h: Regenerate.
This commit is contained in:
Christopher Faylor 2003-12-23 16:26:31 +00:00
parent 1fb9256d7e
commit 29d52c8a27
35 changed files with 513 additions and 744 deletions

View File

@ -1,4 +1,74 @@
2003-12-17 Christopher Faylor <cgf@redhat.com> 2003-12-23 Christopher Faylor <cgf@redhat.com>
* exceptions.cc (set_signal_mask): Redefine to not pass by address.
Report calculated mask in debugging output.
* sigproc.h (set_signal_mask): Reflect above change in declaration.
2003-12-22 Christopher Faylor <cgf@redhat.com>
* path.cc (mount_item::build_win32): Take path apart before feeding it
to fnmunge.
2003-12-21 Christopher Faylor <cgf@redhat.com>
Throughout, change use of _reent_winsup()-> to _my_tls.locals.
instead.
Throughout, remove obsolete MT_SAFE/_CYG_THREAD_FAILSAFE considerations.
Througout, add cygtls.h include.
* Makefile.in (DLL_OFILES): Add cygtls.o. Add some more objects to the
-fomit-frame-pointer list.
* acconfig.h: Remove obsolete settings.
* config.h.in: Ditto.
* bsdlib.cc: Add cygtls.h include.
* configure.in: Remove --enable-extra-threadsafe-checking.
* configure: Regenerate.
* cygtls.h (_local_storage): New struct renamed from _winsup_t (sic).
(_threadinfo:local_clib): Add new field.
(_threadinfo::locals): Ditto.
(_threadinfo::init_thread): Accept second _reent * argument.
(_threadinfo::call): Define as regparm.
(CYGTLS_PADSIZE): Remove unnecessary slop.
(_getreent): Define as a macro.
* thread.h: Remove _CYG_THREAD_FAILSAFE and MT_SAFE stuff.
(_winsup_t): Move to cygtls.h.
(ResourceLocks::ResourceLocks): Eliminate empty constructor.
(MTinterface::reents): Eliminate.
(MTinterface::thread_self_key): Eliminate.
(MTinterface::MTinterface): Eliminate.
* dcrt0.cc: Include stdio.h for _impure_ptr initialization.
(do_global_ctors): Remove run_ctors_p (sic) considerations. Don't call
atexit here.
(__main): Initialize destructors for user here.
(dll_crt0_1): Accept a dummy argument. Don't call init_thread here.
Don't set _impure_ptr here. Call do_global_ctors after more things
have been initialized.
(_dll_crt0): Define zeros buffer as max of needed size of
CYGTLS_PADSIZE so that it can be used for two purposes while minimizing
stack usage. Initialize _impure_ptr specifically, for speed. Call
dll_crt0_1 with buffer argument.
(cygwin_dll_init): Call dll_crt0_1 with dummy argument.
* dtable.cc (dtable::find_unused_handle): Remove call to
AssertResourceOwner.
* exceptions.cc: Move _threadinfo stuff to new file.
* cygtls.cc: New file.
* gentls_offsets: Accommodate increasing complexity of cygtls.h.
* hires.h (hires_base::~hires_base): Remove.
* init.cc (dll_entry): Remove setting of reents.
* thread.cc: Remove syslog.h include.
(__getreent): Simplify to use _my_tls.
(_reent_winsup): Delete.
(AssertResourceOwner): Delete.
(MTinterface::Init): Remove setting of _clib and _winsup, with all that
entails.
(MTinterface::fixup_after_fork): Ditto.
(pthread::thread_init_wrapper): Ditto. Also remove call to
set_tls_self_pointer.
(pthread::set_tls_self_pointer): Eliminate.
(pthread::get_tls_self_pointer): Just return _my_tls.tid;
(__reent_t::init_clib): Eliminate.
* tlsoffsets.h: Regenerate.
2003-12-17 Christopher Faylor <cgf@redhat.com>
* sigproc.cc (proc_subproc): Simplify code to just remove all zombies * sigproc.cc (proc_subproc): Simplify code to just remove all zombies
if SIGCHLD == SIG_IGN. if SIGCHLD == SIG_IGN.

View File

@ -118,9 +118,9 @@ DLL_IMPORTS:=$(w32api_lib)/libkernel32.a
MT_SAFE_OBJECTS:= MT_SAFE_OBJECTS:=
# Please maintain this list in sorted order, with maximum files per 80 col line # Please maintain this list in sorted order, with maximum files per 80 col line
# #
DLL_OFILES:=assert.o autoload.o bsdlib.o cxx.o cygheap.o cygthread.o dcrt0.o \ DLL_OFILES:=assert.o autoload.o bsdlib.o cxx.o cygheap.o cygthread.o cygtls.o \
debug.o delqueue.o devices.o dir.o dlfcn.o dll_init.o dtable.o environ.o \ dcrt0.o debug.o delqueue.o devices.o dir.o dlfcn.o dll_init.o dtable.o \
errno.o exceptions.o exec.o external.o fcntl.o fhandler.o \ environ.o errno.o exceptions.o exec.o external.o fcntl.o fhandler.o \
fhandler_clipboard.o fhandler_console.o fhandler_disk_file.o \ fhandler_clipboard.o fhandler_console.o fhandler_disk_file.o \
fhandler_dsp.o fhandler_fifo.o fhandler_floppy.o fhandler_mem.o \ fhandler_dsp.o fhandler_fifo.o fhandler_floppy.o fhandler_mem.o \
fhandler_nodevice.o fhandler_proc.o fhandler_process.o \ fhandler_nodevice.o fhandler_proc.o fhandler_process.o \
@ -219,12 +219,11 @@ TARGET_LIBS:=$(LIB_NAME) $(CYGWIN_START) $(GMON_START) $(LIBGMON_A) $(SUBLIBS) $
ifneq "${filter -O%,$(CFLAGS)}" "" ifneq "${filter -O%,$(CFLAGS)}" ""
cygheap_CFLAGS:=-fomit-frame-pointer cygheap_CFLAGS:=-fomit-frame-pointer
devices_CFLAGS:=-fomit-frame-pointer -Os
malloc_CFLAGS:=-fomit-frame-pointer
malloc_wrapper_CFLAGS:=-fomit-frame-pointer
shared_CFLAGS:=-fomit-frame-pointer
cygthread_CFLAGS:=-fomit-frame-pointer cygthread_CFLAGS:=-fomit-frame-pointer
miscfuncs_CFLAGS:=-fomit-frame-pointer cygtls_CFLAGS:=-fomit-frame-pointer
devices_CFLAGS:=-fomit-frame-pointer -Os
dir_CFLAGS:=-fomit-frame-pointer
fcntl_CFLAGS:=-fomit-frame-pointer
fhandler_CFLAGS:=-fomit-frame-pointer fhandler_CFLAGS:=-fomit-frame-pointer
fhandler_clipboard_CFLAGS:=-fomit-frame-pointer fhandler_clipboard_CFLAGS:=-fomit-frame-pointer
fhandler_console_CFLAGS:=-fomit-frame-pointer fhandler_console_CFLAGS:=-fomit-frame-pointer
@ -239,16 +238,22 @@ fhandler_raw_CFLAGS:=-fomit-frame-pointer
fhandler_registry_CFLAGS:=-fomit-frame-pointer fhandler_registry_CFLAGS:=-fomit-frame-pointer
fhandler_serial_CFLAGS:=-fomit-frame-pointer fhandler_serial_CFLAGS:=-fomit-frame-pointer
fhandler_socket_CFLAGS:=-fomit-frame-pointer fhandler_socket_CFLAGS:=-fomit-frame-pointer
fhandler_syslog_CFLAGS:=-fomit-frame-pointer
fhandler_tape_CFLAGS:=-fomit-frame-pointer fhandler_tape_CFLAGS:=-fomit-frame-pointer
fhandler_termios_CFLAGS:=-fomit-frame-pointer fhandler_termios_CFLAGS:=-fomit-frame-pointer
fhandler_tty_CFLAGS:=-fomit-frame-pointer fhandler_tty_CFLAGS:=-fomit-frame-pointer
fhandler_virtual_CFLAGS:=-fomit-frame-pointer fhandler_virtual_CFLAGS:=-fomit-frame-pointer
fhandler_windows_CFLAGS:=-fomit-frame-pointer fhandler_windows_CFLAGS:=-fomit-frame-pointer
fhandler_zero_CFLAGS:=-fomit-frame-pointer fhandler_zero_CFLAGS:=-fomit-frame-pointer
malloc_CFLAGS:=-fomit-frame-pointer
malloc_wrapper_CFLAGS:=-fomit-frame-pointer
miscfuncs_CFLAGS:=-fomit-frame-pointer
regcomp_CFLAGS=-fomit-frame-pointer regcomp_CFLAGS=-fomit-frame-pointer
regerror_CFLAGS=-fomit-frame-pointer regerror_CFLAGS=-fomit-frame-pointer
regexec_CFLAGS=-fomit-frame-pointer regexec_CFLAGS=-fomit-frame-pointer
regfree_CFLAGS=-fomit-frame-pointer regfree_CFLAGS=-fomit-frame-pointer
shared_CFLAGS:=-fomit-frame-pointer
smallprint_CFLAGS:=-fomit-frame-pointer
endif endif
.PHONY: all force dll_ofiles install all_target install_target all_host install_host \ .PHONY: all force dll_ofiles install all_target install_target all_host install_host \

View File

@ -1,18 +1,12 @@
/* Define if DEBUGGING support is requested. */ /* Define if DEBUGGING support is requested. */
#undef DEBUGGING #undef DEBUGGING
/* Define if building "extra" thread-safe Cygwin DLL. */
#undef _CYG_THREAD_FAILSAFE
/* Define if GCC supports builtin memset. */ /* Define if GCC supports builtin memset. */
#undef HAVE_BUILTIN_MEMSET #undef HAVE_BUILTIN_MEMSET
/* Define if MALLOC_DEBUGGING support is requested. */ /* Define if MALLOC_DEBUGGING support is requested. */
#undef MALLOC_DEBUG #undef MALLOC_DEBUG
/* Define if building thread-safe Cygwin DLL. */
#undef _MT_SAFE
/* Define if using new vfork functionality. */ /* Define if using new vfork functionality. */
#undef NEWVFORK #undef NEWVFORK

View File

@ -1,33 +1,7 @@
/* config.h.in. Generated automatically from configure.in by autoheader. */ /* config.h.in. Generated from configure.in by autoheader. */
/* Define if using alloca.c. */
#undef C_ALLOCA
/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
This function is required for alloca.c support on those systems. */
#undef CRAY_STACKSEG_END
/* Define if you have alloca, as a function or macro. */
#undef HAVE_ALLOCA
/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
#undef HAVE_ALLOCA_H
/* If using the C implementation of alloca, define if you know the
direction of stack growth for your system; otherwise it will be
automatically deduced at run-time.
STACK_DIRECTION > 0 => grows toward higher addresses
STACK_DIRECTION < 0 => grows toward lower addresses
STACK_DIRECTION = 0 => direction of growth unknown
*/
#undef STACK_DIRECTION
/* Define if DEBUGGING support is requested. */ /* Define if DEBUGGING support is requested. */
#undef DEBUGGING #undef DEBUGGING
/* Define if building "extra" thread-safe Cygwin DLL. */
#undef _CYG_THREAD_FAILSAFE
/* Define if GCC supports builtin memset. */ /* Define if GCC supports builtin memset. */
#undef HAVE_BUILTIN_MEMSET #undef HAVE_BUILTIN_MEMSET
@ -39,3 +13,41 @@
/* Define if using cygserver */ /* Define if using cygserver */
#undef USE_SERVER #undef USE_SERVER
/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
systems. This function is required for `alloca.c' support on those systems.
*/
#undef CRAY_STACKSEG_END
/* Define to 1 if using `alloca.c'. */
#undef C_ALLOCA
/* Define to 1 if you have `alloca', as a function or macro. */
#undef HAVE_ALLOCA
/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
*/
#undef HAVE_ALLOCA_H
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* If using the C implementation of alloca, define if you know the
direction of stack growth for your system; otherwise it will be
automatically deduced at run-time.
STACK_DIRECTION > 0 => grows toward higher addresses
STACK_DIRECTION < 0 => grows toward lower addresses
STACK_DIRECTION = 0 => direction of growth unknown */
#undef STACK_DIRECTION

View File

@ -11,8 +11,6 @@
ac_help= ac_help=
ac_default_prefix=/usr/local ac_default_prefix=/usr/local
# Any additions from configure.in: # Any additions from configure.in:
ac_help="$ac_help
--enable-extra-threadsafe-checking Build a cygwin DLL which is thread safe with extra consistency checking"
ac_help="$ac_help ac_help="$ac_help
--enable-debugging Build a cygwin DLL which has more consistency checking for debugging" --enable-debugging Build a cygwin DLL which has more consistency checking for debugging"
ac_help="$ac_help ac_help="$ac_help
@ -566,7 +564,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh. # ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
echo "configure:570: checking for a BSD compatible install" >&5 echo "configure:568: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -652,7 +650,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
fi fi
echo $ac_n "checking host system type""... $ac_c" 1>&6 echo $ac_n "checking host system type""... $ac_c" 1>&6
echo "configure:656: checking host system type" >&5 echo "configure:654: checking host system type" >&5
host_alias=$host host_alias=$host
case "$host_alias" in case "$host_alias" in
@ -673,7 +671,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$host" 1>&6 echo "$ac_t""$host" 1>&6
echo $ac_n "checking target system type""... $ac_c" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6
echo "configure:677: checking target system type" >&5 echo "configure:675: checking target system type" >&5
target_alias=$target target_alias=$target
case "$target_alias" in case "$target_alias" in
@ -691,7 +689,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$target" 1>&6 echo "$ac_t""$target" 1>&6
echo $ac_n "checking build system type""... $ac_c" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6
echo "configure:695: checking build system type" >&5 echo "configure:693: checking build system type" >&5
build_alias=$build build_alias=$build
case "$build_alias" in case "$build_alias" in
@ -723,7 +721,7 @@ fi
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2 set dummy ${ac_tool_prefix}gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:727: checking for $ac_word" >&5 echo "configure:725: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -755,7 +753,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "gcc", so it can be a program name with args. # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2 set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:759: checking for $ac_word" >&5 echo "configure:757: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -791,7 +789,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args. # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2 set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:795: checking for $ac_word" >&5 echo "configure:793: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -840,7 +838,7 @@ fi
fi fi
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:844: checking whether we are using GNU C" >&5 echo "configure:842: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -849,7 +847,7 @@ else
yes; yes;
#endif #endif
EOF EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:853: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:851: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes ac_cv_prog_gcc=yes
else else
ac_cv_prog_gcc=no ac_cv_prog_gcc=no
@ -864,7 +862,7 @@ if test $ac_cv_prog_gcc = yes; then
ac_save_CFLAGS="$CFLAGS" ac_save_CFLAGS="$CFLAGS"
CFLAGS= CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:868: checking whether ${CC-cc} accepts -g" >&5 echo "configure:866: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -894,7 +892,7 @@ fi
# Extract the first word of "${ac_tool_prefix}g++", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}g++", so it can be a program name with args.
set dummy ${ac_tool_prefix}g++; ac_word=$2 set dummy ${ac_tool_prefix}g++; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:898: checking for $ac_word" >&5 echo "configure:896: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -926,7 +924,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "g++", so it can be a program name with args. # Extract the first word of "g++", so it can be a program name with args.
set dummy g++; ac_word=$2 set dummy g++; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:930: checking for $ac_word" >&5 echo "configure:928: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -962,7 +960,7 @@ if test -z "$CXX"; then
# Extract the first word of "c++", so it can be a program name with args. # Extract the first word of "c++", so it can be a program name with args.
set dummy c++; ac_word=$2 set dummy c++; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:966: checking for $ac_word" >&5 echo "configure:964: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1018,7 +1016,7 @@ EOF
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2 set dummy ${ac_tool_prefix}ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1022: checking for $ac_word" >&5 echo "configure:1020: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1050,7 +1048,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ar", so it can be a program name with args. # Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2 set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1054: checking for $ac_word" >&5 echo "configure:1052: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1085,7 +1083,7 @@ fi
# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
set dummy ${ac_tool_prefix}as; ac_word=$2 set dummy ${ac_tool_prefix}as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1089: checking for $ac_word" >&5 echo "configure:1087: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1117,7 +1115,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "as", so it can be a program name with args. # Extract the first word of "as", so it can be a program name with args.
set dummy as; ac_word=$2 set dummy as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1121: checking for $ac_word" >&5 echo "configure:1119: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1152,7 +1150,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1156: checking for $ac_word" >&5 echo "configure:1154: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1184,7 +1182,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ranlib", so it can be a program name with args. # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2 set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1188: checking for $ac_word" >&5 echo "configure:1186: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1219,7 +1217,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; ac_word=$2 set dummy ${ac_tool_prefix}ld; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1223: checking for $ac_word" >&5 echo "configure:1221: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1251,7 +1249,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ld", so it can be a program name with args. # Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2 set dummy ld; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1255: checking for $ac_word" >&5 echo "configure:1253: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1286,7 +1284,7 @@ fi
# Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args.
set dummy ${ac_tool_prefix}nm; ac_word=$2 set dummy ${ac_tool_prefix}nm; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1290: checking for $ac_word" >&5 echo "configure:1288: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1318,7 +1316,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "nm", so it can be a program name with args. # Extract the first word of "nm", so it can be a program name with args.
set dummy nm; ac_word=$2 set dummy nm; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1322: checking for $ac_word" >&5 echo "configure:1320: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1353,7 +1351,7 @@ fi
# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
set dummy ${ac_tool_prefix}dlltool; ac_word=$2 set dummy ${ac_tool_prefix}dlltool; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1357: checking for $ac_word" >&5 echo "configure:1355: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1385,7 +1383,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "dlltool", so it can be a program name with args. # Extract the first word of "dlltool", so it can be a program name with args.
set dummy dlltool; ac_word=$2 set dummy dlltool; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1389: checking for $ac_word" >&5 echo "configure:1387: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1420,7 +1418,7 @@ fi
# Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
set dummy ${ac_tool_prefix}windres; ac_word=$2 set dummy ${ac_tool_prefix}windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1424: checking for $ac_word" >&5 echo "configure:1422: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1452,7 +1450,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "windres", so it can be a program name with args. # Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2 set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1456: checking for $ac_word" >&5 echo "configure:1454: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1486,7 +1484,7 @@ fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:1490: checking how to run the C preprocessor" >&5 echo "configure:1488: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory. # On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then if test -n "$CPP" && test -d "$CPP"; then
CPP= CPP=
@ -1501,13 +1499,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser, # On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. # not just through cpp.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1505 "configure" #line 1503 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1511: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1509: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@ -1518,13 +1516,13 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp" CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1522 "configure" #line 1520 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1528: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1526: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@ -1535,13 +1533,13 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -nologo -E" CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1539 "configure" #line 1537 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1545: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1543: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@ -1568,19 +1566,19 @@ echo "$ac_t""$CPP" 1>&6
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless! # for constant arguments. Useless!
echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
echo "configure:1572: checking for working alloca.h" >&5 echo "configure:1570: checking for working alloca.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1577 "configure" #line 1575 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <alloca.h> #include <alloca.h>
int main() { int main() {
char *p = alloca(2 * sizeof(int)); char *p = alloca(2 * sizeof(int));
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1584: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1582: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
ac_cv_header_alloca_h=yes ac_cv_header_alloca_h=yes
else else
@ -1601,12 +1599,12 @@ EOF
fi fi
echo $ac_n "checking for alloca""... $ac_c" 1>&6 echo $ac_n "checking for alloca""... $ac_c" 1>&6
echo "configure:1605: checking for alloca" >&5 echo "configure:1603: checking for alloca" >&5
if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1610 "configure" #line 1608 "configure"
#include "confdefs.h" #include "confdefs.h"
#ifdef __GNUC__ #ifdef __GNUC__
@ -1634,7 +1632,7 @@ int main() {
char *p = (char *) alloca(1); char *p = (char *) alloca(1);
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1638: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
ac_cv_func_alloca_works=yes ac_cv_func_alloca_works=yes
else else
@ -1666,12 +1664,12 @@ EOF
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
echo "configure:1670: checking whether alloca needs Cray hooks" >&5 echo "configure:1668: checking whether alloca needs Cray hooks" >&5
if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1675 "configure" #line 1673 "configure"
#include "confdefs.h" #include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2) #if defined(CRAY) && ! defined(CRAY2)
webecray webecray
@ -1696,12 +1694,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
if test $ac_cv_os_cray = yes; then if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do for ac_func in _getb67 GETB67 getb67; do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1700: checking for $ac_func" >&5 echo "configure:1698: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1705 "configure" #line 1703 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */ which can conflict with char $ac_func(); below. */
@ -1724,7 +1722,7 @@ $ac_func();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1728: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_func_$ac_func=yes" eval "ac_cv_func_$ac_func=yes"
else else
@ -1751,7 +1749,7 @@ done
fi fi
echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
echo "configure:1755: checking stack direction for C alloca" >&5 echo "configure:1753: checking stack direction for C alloca" >&5
if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1759,7 +1757,7 @@ else
ac_cv_c_stack_direction=0 ac_cv_c_stack_direction=0
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1763 "configure" #line 1761 "configure"
#include "confdefs.h" #include "confdefs.h"
find_stack_direction () find_stack_direction ()
{ {
@ -1778,7 +1776,7 @@ main ()
exit (find_stack_direction() < 0); exit (find_stack_direction() < 0);
} }
EOF EOF
if { (eval echo configure:1782: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null if { (eval echo configure:1780: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then then
ac_cv_c_stack_direction=1 ac_cv_c_stack_direction=1
else else
@ -1800,7 +1798,7 @@ EOF
fi fi
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
echo "configure:1804: checking whether ${MAKE-make} sets \${MAKE}" >&5 echo "configure:1802: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1837,7 +1835,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1841 "configure" #line 1839 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <string.h> #include <string.h>
@ -1850,7 +1848,7 @@ int main() {
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1854: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:1852: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
use_builtin_memset=yes use_builtin_memset=yes
else else
@ -1874,25 +1872,6 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a
cross_compiling=$ac_cv_prog_cc_cross cross_compiling=$ac_cv_prog_cc_cross
# Check whether --enable-extra-threadsafe-checking or --disable-extra-threadsafe-checking was given.
if test "${enable_extra_threadsafe_checking+set}" = set; then
enableval="$enable_extra_threadsafe_checking"
case "${enableval}" in
yes)
mt_safe_val=1
MT_SAFE=yes
cat >> confdefs.h <<\EOF
#define _CYG_THREAD_FAILSAFE 1
EOF
;;
no)
;;
esac
fi
# Check whether --enable-debugging or --disable-debugging was given. # Check whether --enable-debugging or --disable-debugging was given.
if test "${enable_debugging+set}" = set; then if test "${enable_debugging+set}" = set; then
enableval="$enable_debugging" enableval="$enable_debugging"

View File

@ -117,20 +117,6 @@ if test $use_builtin_memset = "yes"; then
fi fi
AC_LANG_RESTORE AC_LANG_RESTORE
AC_ARG_ENABLE(extra-threadsafe-checking,
[ --enable-extra-threadsafe-checking Build a cygwin DLL which is thread safe with extra consistency checking],
[case "${enableval}" in
yes)
mt_safe_val=1
MT_SAFE=yes
AC_DEFINE(_CYG_THREAD_FAILSAFE)
;;
no)
dnl Don't do anything here to avoid overriding --enable-threadsafe.
;;
esac
])
AC_ARG_ENABLE(debugging, AC_ARG_ENABLE(debugging,
[ --enable-debugging Build a cygwin DLL which has more consistency checking for debugging], [ --enable-debugging Build a cygwin DLL which has more consistency checking for debugging],
[case "${enableval}" in [case "${enableval}" in

View File

@ -9,16 +9,83 @@ details. */
#ifndef _CYGTLS_H #ifndef _CYGTLS_H
#define _CYGTLS_H #define _CYGTLS_H
#include <cygwin/signal.h> #include <signal.h>
#include <pwd.h>
#include <grp.h>
#include <sys/time.h>
#define _NOMNTENT_FUNCS
#include <mntent.h>
#undef _NOMNTENT_FUNCS
#define CYGTLS_INITIALIZED 0x43227 #define CYGTLS_INITIALIZED 0x43227
#define CYGTLS_EXCEPTION (0x43227 + true) #define CYGTLS_EXCEPTION (0x43227 + true)
#ifndef CYG_MAX_PATH
# define CYG_MAX_PATH 260
#endif
#ifndef UNLEN
# define UNLEN 256
#endif
#pragma pack(push,4)
struct _local_storage
{
/*
Needed for the group functions
*/
struct __group16 grp;
char *namearray[2];
int grp_pos;
/* console.cc */
unsigned rarg;
/* dlfcn.cc */
int dl_error;
char dl_buffer[256];
/* passwd.cc */
struct passwd res;
char pass[_PASSWORD_LEN];
int pw_pos;
/* path.cc */
struct mntent mntbuf;
int iteration;
unsigned available_drives;
char mnt_type[80];
char mnt_opts[80];
char mnt_fsname[CYG_MAX_PATH];
char mnt_dir[CYG_MAX_PATH];
/* strerror */
char strerror_buf[20];
/* sysloc.cc */
char *process_ident;
int process_logopt;
int process_facility;
int process_logmask;
/* times.cc */
char timezone_buf[20];
struct tm _localtime_buf;
/* uinfo.cc */
char username[UNLEN + 1];
/* net.cc */
char *ntoa_buf;
struct protoent *protoent_buf;
struct servent *servent_buf;
struct hostent *hostent_buf;
};
/* Please keep this file simple. Changes to the below structure may require /* Please keep this file simple. Changes to the below structure may require
acompanying changes to the very simple parser in the perl script acompanying changes to the very simple parser in the perl script
'gentls_offsets' (<<-- start parsing here). */ 'gentls_offsets' (<<-- start parsing here). */
#pragma pack(push,4)
typedef __uint32_t __stack_t; typedef __uint32_t __stack_t;
struct _threadinfo struct _threadinfo
{ {
@ -35,6 +102,8 @@ struct _threadinfo
siginfo_t *sigwait_info; siginfo_t *sigwait_info;
siginfo_t infodata; siginfo_t infodata;
struct pthread *tid; struct pthread *tid;
struct _reent local_clib;
struct _local_storage locals;
struct _threadinfo *prev, *next; struct _threadinfo *prev, *next;
__stack_t stack[8]; __stack_t stack[8];
int sig; int sig;
@ -43,9 +112,9 @@ struct _threadinfo
/*gentls_offsets*/ /*gentls_offsets*/
static CRITICAL_SECTION protect_linked_list; static CRITICAL_SECTION protect_linked_list;
static void init (); static void init ();
void init_thread (void *); void init_thread (void *) __attribute__ ((regparm (2)));
static void call (DWORD (*) (void *, void *), void *); static void call (DWORD (*) (void *, void *), void *) __attribute__ ((regparm (3)));
void call2 (DWORD (*) (void *, void *), void *, void *); static void call2 (DWORD (*) (void *, void *), void *, void *) __attribute__ ((regparm (3)));
static struct _threadinfo *find_tls (int sig); static struct _threadinfo *find_tls (int sig);
void remove (); void remove ();
void push (__stack_t, bool = false); void push (__stack_t, bool = false);
@ -67,5 +136,7 @@ extern char *_tlstop __asm__ ("%fs:8");
#define _my_tls (((_threadinfo *) _tlsbase)[-1]) #define _my_tls (((_threadinfo *) _tlsbase)[-1])
extern _threadinfo *_main_tls; extern _threadinfo *_main_tls;
#define CYGTLS_PADSIZE (sizeof (_threadinfo) + 64) #define __getreent() (&_my_tls.local_clib)
#define CYGTLS_PADSIZE (sizeof (_threadinfo))
#endif /*_CYGTLS_H*/ #endif /*_CYGTLS_H*/

View File

@ -24,7 +24,6 @@ opterr DATA
optind DATA optind DATA
optopt DATA optopt DATA
optreset DATA optreset DATA
reent_data DATA
_alloca NOSIGFE _alloca NOSIGFE
dll_entry@12 NOSIGFE dll_entry@12 NOSIGFE
__assert SIGFE __assert SIGFE

View File

@ -10,6 +10,7 @@ details. */
#include "winsup.h" #include "winsup.h"
#include <unistd.h> #include <unistd.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "glob.h" #include "glob.h"
#include "exceptions.h" #include "exceptions.h"
@ -89,7 +90,6 @@ extern "C"
char ***main_environ; char ***main_environ;
/* __progname used in getopt error message */ /* __progname used in getopt error message */
char *__progname; char *__progname;
struct _reent reent_data = _REENT_INIT(reent_data);
struct per_process __cygwin_user_data = struct per_process __cygwin_user_data =
{/* initial_sp */ 0, /* magic_biscuit */ 0, {/* initial_sp */ 0, /* magic_biscuit */ 0,
/* dll_major */ CYGWIN_VERSION_DLL_MAJOR, /* dll_major */ CYGWIN_VERSION_DLL_MAJOR,
@ -110,7 +110,7 @@ extern "C"
/* api_minor */ CYGWIN_VERSION_API_MINOR, /* api_minor */ CYGWIN_VERSION_API_MINOR,
/* unused2 */ {0, 0, 0, 0, 0}, /* unused2 */ {0, 0, 0, 0, 0},
/* resourcelocks */ &_reslock, /* threadinterface */ &_mtinterf, /* resourcelocks */ &_reslock, /* threadinterface */ &_mtinterf,
/* impure_ptr */ &reent_data, /* impure_ptr */ NULL,
}; };
bool ignore_case_with_glob; bool ignore_case_with_glob;
int __declspec (dllexport) _check_for_executable = true; int __declspec (dllexport) _check_for_executable = true;
@ -136,25 +136,18 @@ do_global_dtors (void)
static void __stdcall static void __stdcall
do_global_ctors (void (**in_pfunc)(), int force) do_global_ctors (void (**in_pfunc)(), int force)
{ {
if (!force) if (!force && user_data->forkee)
{ return; // inherit constructed stuff from parent pid
if (user_data->forkee || user_data->run_ctors_p)
return; // inherit constructed stuff from parent pid
user_data->run_ctors_p = 1;
}
/* Run ctors backwards, so skip the first entry and find how many /* Run ctors backwards, so skip the first entry and find how many
there are, then run them. */ there are, then run them. */
void (**pfunc)() = in_pfunc; void (**pfunc) () = in_pfunc;
while (*++pfunc) while (*++pfunc)
; ;
while (--pfunc > in_pfunc) while (--pfunc > in_pfunc)
(*pfunc) (); (*pfunc) ();
if (user_data->magic_biscuit == SIZEOF_PER_PROCESS)
atexit (do_global_dtors);
} }
/* /*
@ -530,12 +523,8 @@ alloc_stack (child_info_fork *ci)
opposed to being link-time loaded by Cygwin apps) from a non opposed to being link-time loaded by Cygwin apps) from a non
cygwin app via LoadLibrary. */ cygwin app via LoadLibrary. */
static void static void
dll_crt0_1 () dll_crt0_1 (char *)
{ {
char padding[CYGTLS_PADSIZE];
_main_tls = &_my_tls;
_main_tls->init_thread (padding);
/* According to onno@stack.urc.tue.nl, the exception handler record must /* According to onno@stack.urc.tue.nl, the exception handler record must
be on the stack. */ be on the stack. */
/* FIXME: Verify forked children get their exception handler set up ok. */ /* FIXME: Verify forked children get their exception handler set up ok. */
@ -557,8 +546,6 @@ dll_crt0_1 ()
fork copy code doesn't copy the data in libccrt0.cc (that's why we fork copy code doesn't copy the data in libccrt0.cc (that's why we
pass in the per_process struct into the .dll from libccrt0). */ pass in the per_process struct into the .dll from libccrt0). */
_impure_ptr = &reent_data;
user_data->resourcelocks->Init (); user_data->resourcelocks->Init ();
user_data->threadinterface->Init (); user_data->threadinterface->Init ();
@ -771,15 +758,16 @@ dll_crt0_1 ()
/* Disable case-insensitive globbing */ /* Disable case-insensitive globbing */
ignore_case_with_glob = false; ignore_case_with_glob = false;
/* Flush signals and ensure that signal thread is up and running. Can't
do this for noncygwin case since the signal thread is blocked due to
LoadLibrary serialization. */
wait_for_sigthread ();
set_errno (0); set_errno (0);
MALLOC_CHECK; MALLOC_CHECK;
cygbench (__progname); cygbench (__progname);
/* Flush signals and ensure that signal thread is up and running. Can't
do this for noncygwin case since the signal thread is blocked due to
LoadLibrary serialization. */
wait_for_sigthread ();
if (user_data->main) if (user_data->main)
exit (user_data->main (__argc, __argv, *user_data->envptr)); exit (user_data->main (__argc, __argv, *user_data->envptr));
} }
@ -830,6 +818,21 @@ initial_env ()
_cygwin_testing = 1; _cygwin_testing = 1;
} }
struct _reent *
initialize_main_tls (char *padding)
{
if (!_main_tls)
{
_threadinfo::init ();
_main_tls = &_my_tls;
_main_tls->init_thread (padding);
_main_tls->local_clib._stdin = &_main_tls->local_clib.__sf[0];
_main_tls->local_clib._stdout = &_main_tls->local_clib.__sf[1];
_main_tls->local_clib._stderr = &_main_tls->local_clib.__sf[2];
}
return &_main_tls->local_clib;
}
/* Wrap the real one, otherwise gdb gets confused about /* Wrap the real one, otherwise gdb gets confused about
two symbols with the same name, but different addresses. two symbols with the same name, but different addresses.
@ -840,7 +843,7 @@ extern "C" void __stdcall
_dll_crt0 () _dll_crt0 ()
{ {
initial_env (); initial_env ();
char zeros[sizeof (fork_info->zero)] = {0}; char zeros[max (CYGTLS_PADSIZE, sizeof (child_proc_info->zero))] = {0};
static NO_COPY STARTUPINFO si; static NO_COPY STARTUPINFO si;
main_environ = user_data->envptr; main_environ = user_data->envptr;
@ -859,7 +862,8 @@ _dll_crt0 ()
GetStartupInfo (&si); GetStartupInfo (&si);
child_proc_info = (child_info *) si.lpReserved2; child_proc_info = (child_info *) si.lpReserved2;
if (si.cbReserved2 < EXEC_MAGIC_SIZE || !child_proc_info if (si.cbReserved2 < EXEC_MAGIC_SIZE || !child_proc_info
|| memcmp (child_proc_info->zero, zeros, sizeof (zeros)) != 0) || memcmp (child_proc_info->zero, zeros,
sizeof (child_proc_info->zero)) != 0)
child_proc_info = NULL; child_proc_info = NULL;
else else
{ {
@ -901,19 +905,20 @@ _dll_crt0 ()
break; break;
} }
} }
_threadinfo::init (); user_data->impure_ptr = _impure_ptr = initialize_main_tls (zeros);
dll_crt0_1 (); dll_crt0_1 (zeros);
} }
void void
dll_crt0 (per_process *uptr) dll_crt0 (per_process *uptr)
{ {
char padding[CYGTLS_PADSIZE];
/* Set the local copy of the pointer into the user space. */ /* Set the local copy of the pointer into the user space. */
if (uptr && uptr != user_data) if (uptr && uptr != user_data)
{ {
memcpy (user_data, uptr, per_process_overwrite); memcpy (user_data, uptr, per_process_overwrite);
*(user_data->impure_ptr_ptr) = &reent_data; *(user_data->impure_ptr_ptr) = initialize_main_tls (padding);
} }
_dll_crt0 (); _dll_crt0 ();
} }
@ -937,13 +942,14 @@ cygwin_dll_init ()
user_data->envptr = &envp; user_data->envptr = &envp;
user_data->fmode_ptr = &_fmode; user_data->fmode_ptr = &_fmode;
dll_crt0_1 (); dll_crt0_1 (NULL);
} }
extern "C" void extern "C" void
__main (void) __main (void)
{ {
do_global_ctors (user_data->ctors, false); do_global_ctors (user_data->ctors, false);
atexit (do_global_dtors);
} }
exit_states NO_COPY exit_state; exit_states NO_COPY exit_state;

View File

@ -21,15 +21,13 @@ details. */
#include "dlfcn.h" #include "dlfcn.h"
#include "dll_init.h" #include "dll_init.h"
#include "cygerrno.h" #include "cygerrno.h"
#include "cygtls.h"
#define _dl_error _reent_winsup ()->_dl_error
#define _dl_buffer _reent_winsup ()->_dl_buffer
static void __stdcall static void __stdcall
set_dl_error (const char *str) set_dl_error (const char *str)
{ {
__small_sprintf (_dl_buffer, "%s: %E", str); __small_sprintf (_my_tls.locals.dl_buffer, "%s: %E", str);
_dl_error = 1; _my_tls.locals.dl_error = 1;
} }
/* Look for an executable file given the name and the environment /* Look for an executable file given the name and the environment
@ -145,12 +143,12 @@ char *
dlerror () dlerror ()
{ {
char *res; char *res;
if (!_dl_error) if (!_my_tls.locals.dl_error)
res = NULL; res = NULL;
else else
{ {
_dl_error = 0; _my_tls.locals.dl_error = 0;
res = _dl_buffer; res = _my_tls.locals.dl_buffer;
} }
return res; return res;
} }

View File

@ -200,7 +200,6 @@ dtable::delete_archetype (fhandler_base *fh)
int int
dtable::find_unused_handle (int start) dtable::find_unused_handle (int start)
{ {
AssertResourceOwner (LOCK_FD_LIST, READ_LOCK);
do do
{ {
for (size_t i = start; i < size; i++) for (size_t i = start; i < size; i++)

View File

@ -15,6 +15,7 @@ details. */
#include <stdio.h> #include <stdio.h>
#include "cygerrno.h" #include "cygerrno.h"
#include "thread.h" #include "thread.h"
#include "cygtls.h"
#undef _sys_nerr #undef _sys_nerr
#undef sys_nerr #undef sys_nerr
#undef _sys_errlist #undef _sys_errlist
@ -681,13 +682,8 @@ strerror (int errnum)
error = "Value too large for defined data type"; error = "Value too large for defined data type";
break; break;
default: default:
#ifdef _MT_SAFE __small_sprintf (_my_tls.locals.strerror_buf, "error %d", errnum);
char *buf= _reent_winsup ()->_strerror_buf; error = _my_tls.locals.strerror_buf;
#else
static NO_COPY char buf[20];
#endif
__small_sprintf (buf, "error %d", errnum);
error = buf;
break; break;
} }

View File

@ -36,11 +36,6 @@ static int handle_exceptions (EXCEPTION_RECORD *, void *, CONTEXT *, void *);
extern void sigdelayed (); extern void sigdelayed ();
}; };
_threadinfo NO_COPY dummy_thread;
_threadinfo NO_COPY *_last_thread = &dummy_thread;
CRITICAL_SECTION NO_COPY _threadinfo::protect_linked_list;
extern DWORD sigtid; extern DWORD sigtid;
extern HANDLE hExeced; extern HANDLE hExeced;
@ -129,101 +124,6 @@ init_exceptions (exception_list *el)
init_exception_handler (el); init_exception_handler (el);
} }
void
_threadinfo::set_state (bool is_exception)
{
initialized = CYGTLS_INITIALIZED + is_exception;
}
void
_threadinfo::reset_exception ()
{
if (initialized == CYGTLS_EXCEPTION)
{
#ifdef DEBUGGING
debug_printf ("resetting stack after an exception stack %p, stackptr %p", stack, stackptr);
#endif
set_state (false);
stackptr--;
}
}
void
_threadinfo::call (DWORD (*func) (void *, void *), void *arg)
{
char buf[CYGTLS_PADSIZE];
_my_tls.call2 (func, arg, buf);
}
void
_threadinfo::call2 (DWORD (*func) (void *, void *), void *arg, void *buf)
{
init_thread (buf);
ExitThread (func (arg, buf));
}
void
_threadinfo::init ()
{
InitializeCriticalSection (&protect_linked_list);
}
void
_threadinfo::init_thread (void *x)
{
if (x)
{
memset (this, 0, sizeof (*this));
stackptr = stack;
}
EnterCriticalSection (&protect_linked_list);
prev = _last_thread;
_last_thread->next = this;
_last_thread = this;
LeaveCriticalSection (&protect_linked_list);
set_state (false);
errno_addr = &errno;
}
void
_threadinfo::remove ()
{
EnterCriticalSection (&protect_linked_list);
if (prev)
{
prev->next = next;
if (next)
next->prev = prev;
if (this == _last_thread)
_last_thread = prev;
prev = next = NULL;
}
LeaveCriticalSection (&protect_linked_list);
}
void
_threadinfo::push (__stack_t addr, bool exception)
{
*stackptr++ = (__stack_t) addr;
set_state (exception);
}
__stack_t
_threadinfo::pop ()
{
#ifdef DEBUGGING
assert (stackptr > stack);
#endif
__stack_t res = *--stackptr;
#ifdef DEBUGGING
*stackptr = 0;
debug_printf ("popped %p, stack %p, stackptr %p", res, stack, stackptr);
#endif
return res;
}
extern "C" void extern "C" void
error_start_init (const char *buf) error_start_init (const char *buf)
{ {
@ -663,9 +563,9 @@ handle_sigsuspend (sigset_t tempmask)
sig_dispatch_pending (); sig_dispatch_pending ();
sigset_t oldmask = myself->getsigmask (); // Remember for restoration sigset_t oldmask = myself->getsigmask (); // Remember for restoration
set_signal_mask (tempmask & ~SIG_NONMASKABLE);// Let signals we're set_signal_mask (tempmask &= ~SIG_NONMASKABLE, oldmask);// Let signals we're
// interested in through. // interested in through.
sigproc_printf ("old mask %x, new mask %x", oldmask, tempmask); sigproc_printf ("oldmask %p, newmask %p", oldmask, tempmask);
pthread_testcancel (); pthread_testcancel ();
pthread::cancelable_wait (signal_arrived, INFINITE); pthread::cancelable_wait (signal_arrived, INFINITE);
@ -974,20 +874,24 @@ set_process_mask (sigset_t newmask)
/* Set the signal mask for this process. /* Set the signal mask for this process.
Note that some signals are unmaskable, as in UNIX. */ Note that some signals are unmaskable, as in UNIX. */
extern "C" void __stdcall extern "C" void __stdcall
set_signal_mask (sigset_t newmask, sigset_t& oldmask) set_signal_mask (sigset_t newmask, sigset_t oldmask)
{ {
mask_sync->acquire (INFINITE); mask_sync->acquire (INFINITE);
newmask &= ~SIG_NONMASKABLE; newmask &= ~SIG_NONMASKABLE;
sigproc_printf ("old mask %p, new mask %p", oldmask, newmask); sigset_t mask_bits = oldmask & ~newmask;
sigproc_printf ("oldmask %p, newmask %p, mask_bits %p", oldmask, newmask,
mask_bits);
myself->setsigmask (newmask); // Set a new mask myself->setsigmask (newmask); // Set a new mask
mask_sync->release (); mask_sync->release ();
if (oldmask & ~newmask) if (mask_bits)
sig_dispatch_pending (); sig_dispatch_pending ();
else else
sigproc_printf ("not calling sig_dispatch_pending"); sigproc_printf ("not calling sig_dispatch_pending");
return; return;
} }
extern _threadinfo *_last_thread;
_threadinfo * _threadinfo *
_threadinfo::find_tls (int sig) _threadinfo::find_tls (int sig)
{ {

View File

@ -27,6 +27,7 @@ details. */
#include "heap.h" #include "heap.h"
#include "cygthread.h" #include "cygthread.h"
#include "pwdgrp.h" #include "pwdgrp.h"
#include "cygtls.h"
static external_pinfo * static external_pinfo *
fillout_pinfo (pid_t pid, int winpid) fillout_pinfo (pid_t pid, int winpid)

View File

@ -263,7 +263,8 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls)
if (fork_info->stacksize) if (fork_info->stacksize)
{ {
_main_tls = &_my_tls; _main_tls = &_my_tls;
_my_tls.init_thread (NULL); _main_tls->init_thread (NULL);
// memcpy (&_main_tls->local_clib, _impure_ptr, sizeof (*_main_tls->local_lib));
} }
set_file_api_mode (current_codepage); set_file_api_mode (current_codepage);
@ -553,13 +554,22 @@ fork_parent (HANDLE& hParent, dll *&first_dll,
MALLOC_CHECK; MALLOC_CHECK;
void *impure_beg;
void *impure_end;
if (&_my_tls == _main_tls)
impure_beg = impure_end = NULL;
else
{
impure_beg = _impure_ptr;
impure_end = _impure_ptr + 1;
}
rc = fork_copy (pi, "user/cygwin data", rc = fork_copy (pi, "user/cygwin data",
user_data->data_start, user_data->data_end, user_data->data_start, user_data->data_end,
user_data->bss_start, user_data->bss_end, user_data->bss_start, user_data->bss_end,
cygheap->user_heap.base, cygheap->user_heap.ptr, cygheap->user_heap.base, cygheap->user_heap.ptr,
stack_here, ch.stackbottom, stack_here, ch.stackbottom,
dll_data_start, dll_data_end, dll_data_start, dll_data_end,
dll_bss_start, dll_bss_end, NULL); dll_bss_start, dll_bss_end, impure_beg, impure_end, NULL);
__malloc_unlock (); __malloc_unlock ();
MALLOC_CHECK; MALLOC_CHECK;

View File

@ -6,7 +6,11 @@ my $struct = '';
my @fields = (); my @fields = ();
my $def = ''; my $def = '';
my $tls = join('', <TLS>); my $tls = join('', <TLS>);
$tls =~ s/\A.*?gentls_offsets[^\n]*\n//os; $tls =~ s/\n[^\n]*gentls_offsets[^\n]*\n(.+)\Z/$1/os;
my $pre = $`;
substr($tls, 0, length($pre)) = '';
$pre =~ s/\n#ifndef _[^\n]+\n/\n/os;
$pre .= "\n//*/";
$tls =~ s%/\*\s*gentls_offsets.*?/\*\s*gentls_offsets\s*\*/%%ogs; $tls =~ s%/\*\s*gentls_offsets.*?/\*\s*gentls_offsets\s*\*/%%ogs;
foreach ($tls =~ /^.*\n/mg) { foreach ($tls =~ /^.*\n/mg) {
$def .= $_ if $struct; $def .= $_ if $struct;
@ -32,11 +36,13 @@ foreach ($tls =~ /^.*\n/mg) {
close TLS; close TLS;
open(TMP, '>', "/tmp/$$.cc") or die "$0: couldn't open temporary index file \"/tmp/$$.c\" - $!\n"; open(TMP, '>', "/tmp/$$.cc") or die "$0: couldn't open temporary index file \"/tmp/$$.c\" - $!\n";
print TMP <<EOF; print TMP <<EOF;
#define __INSIDE_CYGWIN__
#define __attribute__(X) #define __attribute__(X)
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <signal.h> #include <signal.h>
typedef void *HANDLE; typedef void *HANDLE;
$pre
$def $def
int int
main(int argc, char **argv) main(int argc, char **argv)

View File

@ -24,9 +24,7 @@ details. */
#include "cygerrno.h" #include "cygerrno.h"
#include "cygheap.h" #include "cygheap.h"
#include "pwdgrp.h" #include "pwdgrp.h"
#include "cygtls.h"
/* Position in the group cache */
#define grp_pos _reent_winsup ()->_grp_pos
static __group32 *group_buf; static __group32 *group_buf;
static pwdgrp gr (group_buf); static pwdgrp gr (group_buf);
@ -208,16 +206,16 @@ getgrnam (const char *name)
extern "C" void extern "C" void
endgrent () endgrent ()
{ {
grp_pos = 0; _my_tls.locals.grp_pos = 0;
} }
extern "C" struct __group32 * extern "C" struct __group32 *
getgrent32 () getgrent32 ()
{ {
if (grp_pos == 0) if (_my_tls.locals.grp_pos == 0)
gr.refresh (true); gr.refresh (true);
if (grp_pos < gr.curr_lines) if (_my_tls.locals.grp_pos < gr.curr_lines)
return group_buf + grp_pos++; return group_buf + _my_tls.locals.grp_pos++;
return NULL; return NULL;
} }
@ -233,7 +231,7 @@ getgrent ()
extern "C" void extern "C" void
setgrent () setgrent ()
{ {
grp_pos = 0; _my_tls.locals.grp_pos = 0;
} }
/* Internal function. ONLY USE THIS INTERNALLY, NEVER `getgrent'!!! */ /* Internal function. ONLY USE THIS INTERNALLY, NEVER `getgrent'!!! */

View File

@ -27,7 +27,6 @@ class hires_base
int inited; int inited;
public: public:
virtual LONGLONG usecs (bool justdelta) {return 0LL;} virtual LONGLONG usecs (bool justdelta) {return 0LL;}
virtual ~hires_base () {}
}; };
class hires_us : hires_base class hires_us : hires_base

View File

@ -232,12 +232,13 @@ details. */
105: Export sigwait. 105: Export sigwait.
106: Export flock. 106: Export flock.
107: Export fcntl64. 107: Export fcntl64.
108: Remove unused (hopefully) reent_data export.
*/ */
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0 #define CYGWIN_VERSION_API_MAJOR 0
#define CYGWIN_VERSION_API_MINOR 107 #define CYGWIN_VERSION_API_MINOR 108
/* There is also a compatibity version number associated with the /* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible shared memory regions. It is incremented when incompatible

View File

@ -51,14 +51,13 @@ dll_entry (HANDLE h, DWORD reason, void *static_load)
switch (reason) switch (reason)
{ {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
_my_tls.stackptr = _my_tls.stack;
dynamically_loaded = (static_load == NULL); dynamically_loaded = (static_load == NULL);
__cygwin_user_data.impure_ptr = &_my_tls.local_clib;
_my_tls.stackptr = _my_tls.stack;
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
break; break;
case DLL_THREAD_ATTACH: case DLL_THREAD_ATTACH:
if (MT_INTERFACE->reent_key.set (&MT_INTERFACE->reents))
api_fatal ("thread initialization failed");
munge_threadfunc (h); munge_threadfunc (h);
break; break;
} }

View File

@ -40,6 +40,8 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <fcntl.h> #include <fcntl.h>
#include "cygerrno.h" #include "cygerrno.h"
#include "thread.h"
#include "cygtls.h"
extern "C" int extern "C" int
daemon (int nochdir, int noclose) daemon (int nochdir, int noclose)

View File

@ -36,6 +36,7 @@ details. */
#include "pinfo.h" #include "pinfo.h"
#include "registry.h" #include "registry.h"
#include "wsock_event.h" #include "wsock_event.h"
#include "cygtls.h"
extern "C" extern "C"
{ {
@ -175,22 +176,16 @@ dump_protoent (struct protoent *p)
extern "C" char * extern "C" char *
cygwin_inet_ntoa (struct in_addr in) cygwin_inet_ntoa (struct in_addr in)
{ {
#ifdef _MT_SAFE
#define ntoa_buf _reent_winsup ()->_ntoa_buf
#else
static char *ntoa_buf = NULL;
#endif
char *res = inet_ntoa (in); char *res = inet_ntoa (in);
if (ntoa_buf) if (_my_tls.locals.ntoa_buf)
{ {
free (ntoa_buf); free (_my_tls.locals.ntoa_buf);
ntoa_buf = NULL; _my_tls.locals.ntoa_buf = NULL;
} }
if (res) if (res)
ntoa_buf = strdup (res); _my_tls.locals.ntoa_buf = strdup (res);
return ntoa_buf; return _my_tls.locals.ntoa_buf;
} }
/* exported as inet_addr: BSD 4.3 */ /* exported as inet_addr: BSD 4.3 */
@ -587,38 +582,34 @@ dup_ent (void *old, void *src0, struct_type type)
return dst; return dst;
} }
#ifdef _MT_SAFE
#define protoent_buf _reent_winsup ()->_protoent_buf
#else
static struct protoent *protoent_buf = NULL;
#endif
/* exported as getprotobyname: standards? */ /* exported as getprotobyname: standards? */
extern "C" struct protoent * extern "C" struct protoent *
cygwin_getprotobyname (const char *p) cygwin_getprotobyname (const char *p)
{ {
if (check_null_str_errno (p)) if (check_null_str_errno (p))
return NULL; return NULL;
protoent_buf = (protoent *) dup_ent (protoent_buf, getprotobyname (p), _my_tls.locals.protoent_buf =
is_protoent); (protoent *) dup_ent (_my_tls.locals.protoent_buf, getprotobyname (p),
if (!protoent_buf) is_protoent);
if (!_my_tls.locals.protoent_buf)
set_winsock_errno (); set_winsock_errno ();
dump_protoent (protoent_buf); dump_protoent (_my_tls.locals.protoent_buf);
return protoent_buf; return _my_tls.locals.protoent_buf;
} }
/* exported as getprotobynumber: standards? */ /* exported as getprotobynumber: standards? */
extern "C" struct protoent * extern "C" struct protoent *
cygwin_getprotobynumber (int number) cygwin_getprotobynumber (int number)
{ {
protoent_buf = (protoent *) dup_ent (protoent_buf, getprotobynumber (number), _my_tls.locals.protoent_buf =
is_protoent); (protoent *) dup_ent (_my_tls.locals.protoent_buf,
if (!protoent_buf) getprotobynumber (number), is_protoent);
if (!_my_tls.locals.protoent_buf)
set_winsock_errno (); set_winsock_errno ();
dump_protoent (protoent_buf); dump_protoent (_my_tls.locals.protoent_buf);
return protoent_buf; return _my_tls.locals.protoent_buf;
} }
bool bool
@ -936,12 +927,6 @@ cygwin_connect (int fd, const struct sockaddr *name, int namelen)
return res; return res;
} }
#ifdef _MT_SAFE
#define servent_buf _reent_winsup ()->_servent_buf
#else
static struct servent *servent_buf = NULL;
#endif
/* exported as getservbyname: standards? */ /* exported as getservbyname: standards? */
extern "C" struct servent * extern "C" struct servent *
cygwin_getservbyname (const char *name, const char *proto) cygwin_getservbyname (const char *name, const char *proto)
@ -951,13 +936,13 @@ cygwin_getservbyname (const char *name, const char *proto)
|| (proto != NULL && check_null_str_errno (proto))) || (proto != NULL && check_null_str_errno (proto)))
return NULL; return NULL;
servent_buf = (servent *) dup_ent (servent_buf, getservbyname (name, proto), _my_tls.locals.servent_buf = (servent *) dup_ent (_my_tls.locals.servent_buf, getservbyname (name, proto),
is_servent); is_servent);
if (!servent_buf) if (!_my_tls.locals.servent_buf)
set_winsock_errno (); set_winsock_errno ();
syscall_printf ("%x = getservbyname (%s, %s)", servent_buf, name, proto); syscall_printf ("%x = getservbyname (%s, %s)", _my_tls.locals.servent_buf, name, proto);
return servent_buf; return _my_tls.locals.servent_buf;
} }
/* exported as getservbyport: standards? */ /* exported as getservbyport: standards? */
@ -968,13 +953,13 @@ cygwin_getservbyport (int port, const char *proto)
if (proto != NULL && check_null_str_errno (proto)) if (proto != NULL && check_null_str_errno (proto))
return NULL; return NULL;
servent_buf = (servent *) dup_ent (servent_buf, getservbyport (port, proto), _my_tls.locals.servent_buf = (servent *) dup_ent (_my_tls.locals.servent_buf, getservbyport (port, proto),
is_servent); is_servent);
if (!servent_buf) if (!_my_tls.locals.servent_buf)
set_winsock_errno (); set_winsock_errno ();
syscall_printf ("%x = getservbyport (%d, %s)", servent_buf, port, proto); syscall_printf ("%x = getservbyport (%d, %s)", _my_tls.locals.servent_buf, port, proto);
return servent_buf; return _my_tls.locals.servent_buf;
} }
extern "C" int extern "C" int
@ -999,12 +984,6 @@ cygwin_gethostname (char *name, size_t len)
return 0; return 0;
} }
#ifdef _MT_SAFE
#define hostent_buf _reent_winsup ()->_hostent_buf
#else
static struct hostent *hostent_buf = NULL;
#endif
/* exported as gethostbyname: standards? */ /* exported as gethostbyname: standards? */
extern "C" struct hostent * extern "C" struct hostent *
cygwin_gethostbyname (const char *name) cygwin_gethostbyname (const char *name)
@ -1036,19 +1015,19 @@ cygwin_gethostbyname (const char *name)
return &tmp; return &tmp;
} }
hostent_buf = (hostent *) dup_ent (hostent_buf, gethostbyname (name), _my_tls.locals.hostent_buf = (hostent *) dup_ent (_my_tls.locals.hostent_buf, gethostbyname (name),
is_hostent); is_hostent);
if (!hostent_buf) if (!_my_tls.locals.hostent_buf)
{ {
set_winsock_errno (); set_winsock_errno ();
set_host_errno (); set_host_errno ();
} }
else else
{ {
debug_printf ("h_name %s", hostent_buf->h_name); debug_printf ("h_name %s", _my_tls.locals.hostent_buf->h_name);
h_errno = 0; h_errno = 0;
} }
return hostent_buf; return _my_tls.locals.hostent_buf;
} }
/* exported as gethostbyaddr: standards? */ /* exported as gethostbyaddr: standards? */
@ -1059,20 +1038,20 @@ cygwin_gethostbyaddr (const char *addr, int len, int type)
if (__check_invalid_read_ptr_errno (addr, len)) if (__check_invalid_read_ptr_errno (addr, len))
return NULL; return NULL;
hostent_buf = (hostent *) dup_ent (hostent_buf, _my_tls.locals.hostent_buf = (hostent *) dup_ent (_my_tls.locals.hostent_buf,
gethostbyaddr (addr, len, type), gethostbyaddr (addr, len, type),
is_hostent); is_hostent);
if (!hostent_buf) if (!_my_tls.locals.hostent_buf)
{ {
set_winsock_errno (); set_winsock_errno ();
set_host_errno (); set_host_errno ();
} }
else else
{ {
debug_printf ("h_name %s", hostent_buf->h_name); debug_printf ("h_name %s", _my_tls.locals.hostent_buf->h_name);
h_errno = 0; h_errno = 0;
} }
return hostent_buf; return _my_tls.locals.hostent_buf;
} }
/* exported as accept: standards? */ /* exported as accept: standards? */

View File

@ -26,12 +26,8 @@ details. */
on the first call that needs information from it. */ on the first call that needs information from it. */
passwd *passwd_buf; passwd *passwd_buf;
/* FIXME: This really should use a constructor, but they are slow */
static pwdgrp pr (passwd_buf); static pwdgrp pr (passwd_buf);
/* Position in the passwd cache */
#define pw_pos _reent_winsup ()->_pw_pos
/* Parse /etc/passwd line into passwd structure. */ /* Parse /etc/passwd line into passwd structure. */
bool bool
pwdgrp::parse_passwd () pwdgrp::parse_passwd ()
@ -254,10 +250,10 @@ getpwnam_r (const char *nam, struct passwd *pwd, char *buffer, size_t bufsize, s
extern "C" struct passwd * extern "C" struct passwd *
getpwent (void) getpwent (void)
{ {
if (pw_pos == 0) if (_my_tls.locals.pw_pos == 0)
pr.refresh (true); pr.refresh (true);
if (pw_pos < pr.curr_lines) if (_my_tls.locals.pw_pos < pr.curr_lines)
return passwd_buf + pw_pos++; return passwd_buf + _my_tls.locals.pw_pos++;
return NULL; return NULL;
} }
@ -271,13 +267,13 @@ getpwduid (__uid16_t)
extern "C" void extern "C" void
setpwent (void) setpwent (void)
{ {
pw_pos = 0; _my_tls.locals.pw_pos = 0;
} }
extern "C" void extern "C" void
endpwent (void) endpwent (void)
{ {
pw_pos = 0; _my_tls.locals.pw_pos = 0;
} }
extern "C" int extern "C" int
@ -289,7 +285,7 @@ setpassent ()
extern "C" char * extern "C" char *
getpass (const char * prompt) getpass (const char * prompt)
{ {
char *pass=_reent_winsup ()->_pass; char *pass = _my_tls.locals.pass;
struct termios ti, newti; struct termios ti, newti;
cygheap_fdget fhstdin (0); cygheap_fdget fhstdin (0);

View File

@ -72,16 +72,9 @@ details. */
#include "cygheap.h" #include "cygheap.h"
#include "shared_info.h" #include "shared_info.h"
#include "registry.h" #include "registry.h"
#include "cygtls.h"
#include <assert.h> #include <assert.h>
#ifdef _MT_SAFE
#define iteration _reent_winsup ()->_iteration
#define available_drives _reent_winsup ()->available_drives
#else
static int iteration;
static DWORD available_drives;
#endif
static int normalize_win32_path (const char *src, char *dst); static int normalize_win32_path (const char *src, char *dst);
static void slashify (const char *src, char *dst, int trailing_slash_p); static void slashify (const char *src, char *dst, int trailing_slash_p);
static void backslashify (const char *src, char *dst, int trailing_slash_p); static void backslashify (const char *src, char *dst, int trailing_slash_p);
@ -1235,7 +1228,7 @@ void
mount_item::fnmunge (char *dst, const char *src) mount_item::fnmunge (char *dst, const char *src)
{ {
int name_type; int name_type;
if (!(flags & MOUNT_ENC) || !(name_type = special_name (src))) if (!(name_type = special_name (src)))
strcpy (dst, src); strcpy (dst, src);
else else
{ {
@ -1286,7 +1279,25 @@ mount_item::build_win32 (char *dst, const char *src, unsigned *outflags, unsigne
/* nothing */; /* nothing */;
else if ((!(flags & MOUNT_ENC) && isdrive (dst) && !dst[2]) || *p) else if ((!(flags & MOUNT_ENC) && isdrive (dst) && !dst[2]) || *p)
dst[n++] = '\\'; dst[n++] = '\\';
fnmunge (dst + n, p); if (!*p || !(flags & MOUNT_ENC))
strcpy (dst + n, p);
else
while (*p)
{
char slash = 0;
char *s = strchr (p + 1, '/');
if (s)
{
slash = *s;
*s = '\0';
}
fnmunge (dst += n, p);
if (!s)
break;
n = strlen (dst);
*s = slash;
p = s;
}
} }
/* conv_to_win32_path: Ensure src_path is a pure Win32 path and store /* conv_to_win32_path: Ensure src_path is a pure Win32 path and store
@ -2234,18 +2245,14 @@ mount_info::del_item (const char *path, unsigned flags, int reg_p)
static mntent * static mntent *
fillout_mntent (const char *native_path, const char *posix_path, unsigned flags) fillout_mntent (const char *native_path, const char *posix_path, unsigned flags)
{ {
#ifdef _MT_SAFE struct mntent& ret=_my_tls.locals.mntbuf;
struct mntent &ret=_reent_winsup ()->mntbuf;
#else
static NO_COPY struct mntent ret;
#endif
/* Remove drivenum from list if we see a x: style path */ /* Remove drivenum from list if we see a x: style path */
if (strlen (native_path) == 2 && native_path[1] == ':') if (strlen (native_path) == 2 && native_path[1] == ':')
{ {
int drivenum = cyg_tolower (native_path[0]) - 'a'; int drivenum = cyg_tolower (native_path[0]) - 'a';
if (drivenum >= 0 && drivenum <= 31) if (drivenum >= 0 && drivenum <= 31)
available_drives &= ~(1 << drivenum); _my_tls.locals.available_drives &= ~(1 << drivenum);
} }
/* Pass back pointers to mount_table strings reserved for use by /* Pass back pointers to mount_table strings reserved for use by
@ -2253,40 +2260,39 @@ fillout_mntent (const char *native_path, const char *posix_path, unsigned flags)
table because the mount table might change, causing weird effects table because the mount table might change, causing weird effects
from the getmntent user's point of view. */ from the getmntent user's point of view. */
strcpy (_reent_winsup ()->mnt_fsname, native_path); strcpy (_my_tls.locals.mnt_fsname, native_path);
ret.mnt_fsname = _reent_winsup ()->mnt_fsname; ret.mnt_fsname = _my_tls.locals.mnt_fsname;
strcpy (_reent_winsup ()->mnt_dir, posix_path); strcpy (_my_tls.locals.mnt_dir, posix_path);
ret.mnt_dir = _reent_winsup ()->mnt_dir; ret.mnt_dir = _my_tls.locals.mnt_dir;
if (!(flags & MOUNT_SYSTEM)) /* user mount */ if (!(flags & MOUNT_SYSTEM)) /* user mount */
strcpy (_reent_winsup ()->mnt_type, (char *) "user"); strcpy (_my_tls.locals.mnt_type, (char *) "user");
else /* system mount */ else /* system mount */
strcpy (_reent_winsup ()->mnt_type, (char *) "system"); strcpy (_my_tls.locals.mnt_type, (char *) "system");
ret.mnt_type = _reent_winsup ()->mnt_type; ret.mnt_type = _my_tls.locals.mnt_type;
/* mnt_opts is a string that details mount params such as /* mnt_opts is a string that details mount params such as
binary or textmode, or exec. We don't print binary or textmode, or exec. We don't print
`silent' here; it's a magic internal thing. */ `silent' here; it's a magic internal thing. */
if (!(flags & MOUNT_BINARY)) if (!(flags & MOUNT_BINARY))
strcpy (_reent_winsup ()->mnt_opts, (char *) "textmode"); strcpy (_my_tls.locals.mnt_opts, (char *) "textmode");
else else
strcpy (_reent_winsup ()->mnt_opts, (char *) "binmode"); strcpy (_my_tls.locals.mnt_opts, (char *) "binmode");
if (flags & MOUNT_CYGWIN_EXEC) if (flags & MOUNT_CYGWIN_EXEC)
strcat (_reent_winsup ()->mnt_opts, (char *) ",cygexec"); strcat (_my_tls.locals.mnt_opts, (char *) ",cygexec");
else if (flags & MOUNT_EXEC) else if (flags & MOUNT_EXEC)
strcat (_reent_winsup ()->mnt_opts, (char *) ",exec"); strcat (_my_tls.locals.mnt_opts, (char *) ",exec");
else if (flags & MOUNT_NOTEXEC) else if (flags & MOUNT_NOTEXEC)
strcat (_reent_winsup ()->mnt_opts, (char *) ",noexec"); strcat (_my_tls.locals.mnt_opts, (char *) ",noexec");
if (flags & MOUNT_ENC) if (flags & MOUNT_ENC)
strcat (_reent_winsup ()->mnt_opts, ",managed"); strcat (_my_tls.locals.mnt_opts, ",managed");
if ((flags & MOUNT_CYGDRIVE)) /* cygdrive */ if ((flags & MOUNT_CYGDRIVE)) /* cygdrive */
strcat (_reent_winsup ()->mnt_opts, (char *) ",noumount"); strcat (_my_tls.locals.mnt_opts, (char *) ",noumount");
ret.mnt_opts = _my_tls.locals.mnt_opts;
ret.mnt_opts = _reent_winsup ()->mnt_opts;
ret.mnt_freq = 1; ret.mnt_freq = 1;
ret.mnt_passno = 1; ret.mnt_passno = 1;
@ -2307,16 +2313,16 @@ cygdrive_getmntent ()
DWORD mask = 1, drive = 'a'; DWORD mask = 1, drive = 'a';
struct mntent *ret = NULL; struct mntent *ret = NULL;
while (available_drives) while (_my_tls.locals.available_drives)
{ {
for (/* nothing */; drive <= 'z'; mask <<= 1, drive++) for (/* nothing */; drive <= 'z'; mask <<= 1, drive++)
if (available_drives & mask) if (_my_tls.locals.available_drives & mask)
break; break;
__small_sprintf (native_path, "%c:\\", drive); __small_sprintf (native_path, "%c:\\", drive);
if (GetFileAttributes (native_path) == INVALID_FILE_ATTRIBUTES) if (GetFileAttributes (native_path) == INVALID_FILE_ATTRIBUTES)
{ {
available_drives &= ~mask; _my_tls.locals.available_drives &= ~mask;
continue; continue;
} }
native_path[2] = '\0'; native_path[2] = '\0';
@ -2425,15 +2431,15 @@ cygwin_umount (const char *path, unsigned flags)
extern "C" FILE * extern "C" FILE *
setmntent (const char *filep, const char *) setmntent (const char *filep, const char *)
{ {
iteration = 0; _my_tls.locals.iteration = 0;
available_drives = GetLogicalDrives (); _my_tls.locals.available_drives = GetLogicalDrives ();
return (FILE *) filep; return (FILE *) filep;
} }
extern "C" struct mntent * extern "C" struct mntent *
getmntent (FILE *) getmntent (FILE *)
{ {
return mount_table->getmntent (iteration++); return mount_table->getmntent (_my_tls.locals.iteration++);
} }
extern "C" int extern "C" int

View File

@ -257,6 +257,7 @@ pinfo::set_acl()
void void
_pinfo::set_ctty (tty_min *tc, int flags, fhandler_tty_slave *arch) _pinfo::set_ctty (tty_min *tc, int flags, fhandler_tty_slave *arch)
{ {
debug_printf ("ctty %d", ctty);
if ((ctty < 0 || ctty == tc->ntty) && !(flags & O_NOCTTY)) if ((ctty < 0 || ctty == tc->ntty) && !(flags & O_NOCTTY))
{ {
ctty = tc->ntty; ctty = tc->ntty;

View File

@ -22,6 +22,7 @@ extern struct __group32 *internal_getgrent (int);
int internal_getgroups (int, __gid32_t *, cygpsid * = NULL); int internal_getgroups (int, __gid32_t *, cygpsid * = NULL);
#include "sync.h" #include "sync.h"
#include "cygtls.h"
class pwdgrp class pwdgrp
{ {
unsigned pwdgrp_buf_elem_size; unsigned pwdgrp_buf_elem_size;

View File

@ -588,8 +588,17 @@ int __stdcall
sig_dispatch_pending () sig_dispatch_pending ()
{ {
if (exit_state || GetCurrentThreadId () == sigtid || !sigqueue.start.next) if (exit_state || GetCurrentThreadId () == sigtid || !sigqueue.start.next)
return 0; {
#ifdef DEBUGGING
sigproc_printf ("exit_state %d, GetCurrentThreadId () %p, sigtid %p, sigqueue.start.next %p",
exit_state, GetCurrentThreadId (), sigtid, sigqueue.start.next);
#endif
return 0;
}
#ifdef DEBUGGING
sigproc_printf ("flushing");
#endif
(void) sig_send (myself, __SIGFLUSH); (void) sig_send (myself, __SIGFLUSH);
return call_signal_handler_now (); return call_signal_handler_now ();
} }
@ -1155,8 +1164,15 @@ wait_sig (VOID *self)
sig_clear (-pack.sig); sig_clear (-pack.sig);
else else
{ {
if (sig_handle (pack.sig, *pack.mask, pack.pid, pack.tls) <= 0) int sigres = sig_handle (pack.sig, *pack.mask, pack.pid, pack.tls);
sigqueue.add (pack.sig, pack.pid, pack.tls);// FIXME: Shouldn't add this in !sh condition if (sigres <= 0)
{
#ifdef DEBUGGING
if (!sigres)
system_printf ("Failed to arm signal %d from pid %d");
#endif
sigqueue.add (pack.sig, pack.pid, pack.tls);// FIXME: Shouldn't add this in !sh condition
}
if (pack.sig == SIGCHLD) if (pack.sig == SIGCHLD)
proc_subproc (PROC_CLEARWAIT, 0); proc_subproc (PROC_CLEARWAIT, 0);
} }

View File

@ -54,7 +54,7 @@ extern HANDLE sigCONT;
bool __stdcall my_parent_is_alive (); bool __stdcall my_parent_is_alive ();
int __stdcall sig_dispatch_pending (); int __stdcall sig_dispatch_pending ();
#ifdef _PINFO_H #ifdef _PINFO_H
extern "C" void __stdcall set_signal_mask (sigset_t newmask, sigset_t& = myself->getsigmask ()); extern "C" void __stdcall set_signal_mask (sigset_t newmask, sigset_t = myself->getsigmask ());
#endif #endif
int __stdcall handle_sigprocmask (int sig, const sigset_t *set, int __stdcall handle_sigprocmask (int sig, const sigset_t *set,
sigset_t *oldset, sigset_t& opmask) sigset_t *oldset, sigset_t& opmask)

View File

@ -319,7 +319,9 @@ setsid (void)
/* assuming that fork was successful */ /* assuming that fork was successful */
} }
if (myself->pgid != myself->pid) if (myself->pgid == myself->pid)
syscall_printf ("hmm. pgid %d pid %d", myself->pgid, myself->pid);
else
{ {
if (myself->ctty >= 0 && fhandler_console::open_fhs <= 0) if (myself->ctty >= 0 && fhandler_console::open_fhs <= 0)
{ {

View File

@ -21,6 +21,7 @@ details. */
#include "cygerrno.h" #include "cygerrno.h"
#include "cygheap.h" #include "cygheap.h"
#include "thread.h" #include "thread.h"
#include "cygtls.h"
/* FIXME: These should probably be in the registry. */ /* FIXME: These should probably be in the registry. */
/* FIXME: The Win95 path should be whatever slash is */ /* FIXME: The Win95 path should be whatever slash is */
@ -38,50 +39,31 @@ get_win95_event_log_path ()
return WIN95_EVENT_LOG_PATH; return WIN95_EVENT_LOG_PATH;
} }
/* FIXME: For MT safe code these will need to be replaced */ /* openlog: save the passed args. Don't open the
system log (NT) or log file (95) yet. */
#ifdef _MT_SAFE
#define process_ident _reent_winsup ()->_process_ident
#define process_logopt _reent_winsup ()->_process_logopt
#define process_facility _reent_winsup ()->_process_facility
/* Default priority logmask */
#define process_logmask _reent_winsup ()->_process_logmask
#else
static char *process_ident = 0;
static int process_logopt = 0;
static int process_facility = 0;
/* Default priority logmask */
static int process_logmask = LOG_UPTO (LOG_DEBUG);
#endif
/*
* openlog: save the passed args. Don't open the
* system log (NT) or log file (95) yet.
*/
extern "C" void extern "C" void
openlog (const char *ident, int logopt, int facility) openlog (const char *ident, int logopt, int facility)
{ {
debug_printf ("openlog called with (%s, %d, %d)", debug_printf ("openlog called with (%s, %d, %d)",
ident ? ident : "<NULL>", logopt, facility); ident ? ident : "<NULL>", logopt, facility);
if (process_ident != NULL) if (_my_tls.locals.process_ident != NULL)
{ {
free (process_ident); free (_my_tls.locals.process_ident);
process_ident = 0; _my_tls.locals.process_ident = 0;
} }
if (ident) if (ident)
{ {
process_ident = (char *) malloc (strlen (ident) + 1); _my_tls.locals.process_ident = (char *) malloc (strlen (ident) + 1);
if (process_ident == NULL) if (_my_tls.locals.process_ident == NULL)
{ {
debug_printf ("failed to allocate memory for process_ident"); debug_printf ("failed to allocate memory for _my_tls.locals.process_ident");
return; return;
} }
strcpy (process_ident, ident); strcpy (_my_tls.locals.process_ident, ident);
} }
process_logopt = logopt; _my_tls.locals.process_logopt = logopt;
process_facility = facility; _my_tls.locals.process_facility = facility;
} }
/* setlogmask: set the log priority mask and return previous mask. /* setlogmask: set the log priority mask and return previous mask.
@ -90,16 +72,16 @@ int
setlogmask (int maskpri) setlogmask (int maskpri)
{ {
if (maskpri == 0) if (maskpri == 0)
return process_logmask; return _my_tls.locals.process_logmask;
int old_mask = process_logmask; int old_mask = _my_tls.locals.process_logmask;
process_logmask = maskpri & LOG_PRIMASK; _my_tls.locals.process_logmask = maskpri & LOG_PRIMASK;
return old_mask; return old_mask;
} }
/* Private class used to handle formatting of syslog message */ /* Private class used to handle formatting of syslog message
/* It is named pass_handler because it does a two-pass handling of log It is named pass_handler because it does a two-pass handling of log
strings. The first pass counts the length of the string, and the second strings. The first pass counts the length of the string, and the second
one builds the string. */ one builds the string. */
@ -211,10 +193,10 @@ vsyslog (int priority, const char *message, va_list ap)
{ {
debug_printf ("%x %s", priority, message); debug_printf ("%x %s", priority, message);
/* If the priority fails the current mask, reject */ /* If the priority fails the current mask, reject */
if (((priority & LOG_PRIMASK) & process_logmask) == 0) if (((priority & LOG_PRIMASK) & _my_tls.locals.process_logmask) == 0)
{ {
debug_printf ("failing message %x due to priority mask %x", debug_printf ("failing message %x due to priority mask %x",
priority, process_logmask); priority, _my_tls.locals.process_logmask);
return; return;
} }
@ -290,12 +272,12 @@ vsyslog (int priority, const char *message, va_list ap)
pass.set_message ((char *) alloca (n)); pass.set_message ((char *) alloca (n));
/* Deal with ident_string */ /* Deal with ident_string */
if (process_ident != NULL) if (_my_tls.locals.process_ident != NULL)
{ {
if (pass.print ("%s : ", process_ident) == -1) if (pass.print ("%s : ", _my_tls.locals.process_ident) == -1)
return; return;
} }
if (process_logopt & LOG_PID) if (_my_tls.locals.process_logopt & LOG_PID)
{ {
if (pass.print ("PID %u : ", getpid ()) == -1) if (pass.print ("PID %u : ", getpid ()) == -1)
return; return;
@ -353,8 +335,8 @@ vsyslog (int priority, const char *message, va_list ap)
if (wincap.has_eventlog ()) if (wincap.has_eventlog ())
{ {
/* For NT, open the event log and send the message */ /* For NT, open the event log and send the message */
HANDLE hEventSrc = RegisterEventSourceA (NULL, (process_ident != NULL) ? HANDLE hEventSrc = RegisterEventSourceA (NULL, (_my_tls.locals.process_ident != NULL) ?
process_ident : CYGWIN_LOG_NAME); _my_tls.locals.process_ident : CYGWIN_LOG_NAME);
if (hEventSrc == NULL) if (hEventSrc == NULL)
{ {
debug_printf ("RegisterEventSourceA failed with %E"); debug_printf ("RegisterEventSourceA failed with %E");

View File

@ -34,7 +34,6 @@ details. */
#include "cygerrno.h" #include "cygerrno.h"
#include <assert.h> #include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include <syslog.h>
#include "pinfo.h" #include "pinfo.h"
#include "sigproc.h" #include "sigproc.h"
#include "perprocess.h" #include "perprocess.h"
@ -48,112 +47,36 @@ details. */
extern int threadsafe; extern int threadsafe;
#undef __getreent
extern "C" struct _reent * extern "C" struct _reent *
__getreent () __getreent ()
{ {
struct __reent_t *_r = return &_my_tls.local_clib;
(struct __reent_t *) MT_INTERFACE->reent_key.get ();
if (_r == 0)
{
#ifdef _CYG_THREAD_FAILSAFE
system_printf ("local thread storage not inited");
#endif
/* Return _impure_ptr as long as MTinterface is not initialized */
return _impure_ptr;
}
return _r->_clib;
}
struct _winsup_t *
_reent_winsup ()
{
struct __reent_t *_r =
(struct __reent_t *) MT_INTERFACE->reent_key.get ();
if (_r == 0)
{
#ifdef _CYG_THREAD_FAILSAFE
system_printf ("local thread storage not inited");
#endif
return NULL;
}
return _r->_winsup;
} }
inline LPCRITICAL_SECTION inline LPCRITICAL_SECTION
ResourceLocks::Lock (int _resid) ResourceLocks::Lock (int _resid)
{ {
#ifdef _CYG_THREAD_FAILSAFE
if (!inited)
system_printf ("lock called before initialization");
thread_printf
("Get Resource lock %d ==> %p for %p , real : %d , threadid %d ", _resid,
&lock, user_data, myself->pid, GetCurrentThreadId ());
#endif
return &lock; return &lock;
} }
void void
SetResourceLock (int _res_id, int _mode, const char *_function) SetResourceLock (int _res_id, int _mode, const char *_function)
{ {
#ifdef _CYG_THREAD_FAILSAFE
thread_printf ("Set resource lock %d mode %d for %s start",
_res_id, _mode, _function);
#endif
EnterCriticalSection (user_data->resourcelocks->Lock (_res_id)); EnterCriticalSection (user_data->resourcelocks->Lock (_res_id));
#ifdef _CYG_THREAD_FAILSAFE
user_data->resourcelocks->owner = GetCurrentThreadId ();
user_data->resourcelocks->count++;
#endif
} }
void void
ReleaseResourceLock (int _res_id, int _mode, const char *_function) ReleaseResourceLock (int _res_id, int _mode, const char *_function)
{ {
#ifdef _CYG_THREAD_FAILSAFE
thread_printf ("Release resource lock %d mode %d for %s done", _res_id,
_mode, _function);
AssertResourceOwner (_res_id, _mode);
user_data->resourcelocks->count--;
if (user_data->resourcelocks->count == 0)
user_data->resourcelocks->owner = 0;
#endif
LeaveCriticalSection (user_data->resourcelocks->Lock (_res_id)); LeaveCriticalSection (user_data->resourcelocks->Lock (_res_id));
} }
#ifdef _CYG_THREAD_FAILSAFE
void
AssertResourceOwner (int _res_id, int _mode)
{
thread_printf
("Assert Resource lock %d ==> for %p , real : %d , threadid %d count %d owner %d",
_res_id, user_data, myself->pid, GetCurrentThreadId (),
user_data->resourcelocks->count, user_data->resourcelocks->owner);
if (user_data && (user_data->resourcelocks->owner != GetCurrentThreadId ()))
system_printf ("assertion failed, not the resource owner");
}
#endif
void void
ResourceLocks::Init () ResourceLocks::Init ()
{ {
InitializeCriticalSection (&lock); InitializeCriticalSection (&lock);
inited = true; inited = true;
#ifdef _CYG_THREAD_FAILSAFE
owner = 0;
count = 0;
#endif
thread_printf ("lock %p inited by %p , %d", &lock, user_data, myself->pid); thread_printf ("lock %p inited by %p , %d", &lock, user_data, myself->pid);
} }
@ -171,11 +94,6 @@ ResourceLocks::Delete ()
void void
MTinterface::Init () MTinterface::Init ()
{ {
reents._clib = _impure_ptr;
reents._winsup = &winsup_reent;
winsup_reent._process_logmask = LOG_UPTO (LOG_DEBUG);
reent_key.set (&reents);
pthread_mutex::init_mutex (); pthread_mutex::init_mutex ();
pthread_cond::init_mutex (); pthread_cond::init_mutex ();
pthread_rwlock::init_mutex (); pthread_rwlock::init_mutex ();
@ -193,14 +111,6 @@ MTinterface::fixup_after_fork (void)
{ {
pthread_key::fixup_after_fork (); pthread_key::fixup_after_fork ();
/* As long as the signal handling not multithreaded
switch reents storage back to _impure_ptr for the mainthread
to support fork from threads other than the mainthread */
reents._clib = _impure_ptr;
reents._winsup = &winsup_reent;
winsup_reent._process_logmask = LOG_UPTO (LOG_DEBUG);
reent_key.set (&reents);
threadcount = 0; threadcount = 0;
pthread::init_mainthread (); pthread::init_mainthread ();
@ -232,7 +142,6 @@ pthread::init_mainthread ()
GetCurrentProcess (), &thread->win32_obj_id, GetCurrentProcess (), &thread->win32_obj_id,
0, FALSE, DUPLICATE_SAME_ACCESS)) 0, FALSE, DUPLICATE_SAME_ACCESS))
api_fatal ("failed to create mainthread handle"); api_fatal ("failed to create mainthread handle");
thread->set_tls_self_pointer ();
if (!thread->create_cancel_event ()) if (!thread->create_cancel_event ())
api_fatal ("couldn't create cancel event for main thread"); api_fatal ("couldn't create cancel event for main thread");
thread->postcreate (); thread->postcreate ();
@ -247,20 +156,12 @@ pthread::self ()
return pthread_null::get_null_pthread (); return pthread_null::get_null_pthread ();
} }
void
pthread::set_tls_self_pointer ()
{
MT_INTERFACE->thread_self_key.set (this);
}
pthread * pthread *
pthread::get_tls_self_pointer () pthread::get_tls_self_pointer ()
{ {
return (pthread *) MT_INTERFACE->thread_self_key.get (); return _my_tls.tid;
} }
List<pthread> pthread::threads; List<pthread> pthread::threads;
/* member methods */ /* member methods */
@ -1876,18 +1777,6 @@ verifyable_object_isvalid (void const * objectptr, long magic)
return verifyable_object_isvalid (objectptr, magic, NULL); return verifyable_object_isvalid (objectptr, magic, NULL);
} }
inline void
__reent_t::init_clib (struct _reent& var)
{
var = ((struct _reent) _REENT_INIT (var));
var._stdin = _GLOBAL_REENT->_stdin;
var._stdout = _GLOBAL_REENT->_stdout;
var._stderr = _GLOBAL_REENT->_stderr;
var.__sdidinit = _GLOBAL_REENT->__sdidinit;
var.__cleanup = _GLOBAL_REENT->__cleanup;
_clib = &var;
};
DWORD WINAPI DWORD WINAPI
pthread::thread_init_wrapper (void *arg) pthread::thread_init_wrapper (void *arg)
{ {
@ -1897,32 +1786,14 @@ pthread::thread_init_wrapper (void *arg)
exception_list cygwin_except_entry; exception_list cygwin_except_entry;
init_exceptions (&cygwin_except_entry); /* Initialize SIGSEGV handling, etc. */ init_exceptions (&cygwin_except_entry); /* Initialize SIGSEGV handling, etc. */
thread->set_tls_self_pointer ();
struct __reent_t local_reent;
struct _winsup_t local_winsup;
struct _reent local_clib;
memset (&local_winsup, 0, sizeof (struct _winsup_t));
local_reent.init_clib (local_clib);
local_reent._winsup = &local_winsup;
local_winsup._process_logmask = LOG_UPTO (LOG_DEBUG);
MT_INTERFACE->reent_key.set (&local_reent);
thread->mutex.lock (); thread->mutex.lock ();
// if thread is detached force cleanup on exit // if thread is detached force cleanup on exit
if (thread->attr.joinable == PTHREAD_CREATE_DETACHED && thread->joiner == NULL) if (thread->attr.joinable == PTHREAD_CREATE_DETACHED && thread->joiner == NULL)
thread->joiner = thread; thread->joiner = thread;
thread->mutex.unlock (); thread->mutex.unlock ();
#ifdef _CYG_THREAD_FAILSAFE thread_printf ("started thread %p %p %p %p %p %p", arg, &_my_tls.local_clib,
if (_REENT == _impure_ptr)
system_printf ("local storage for thread isn't setup correctly");
#endif
thread_printf ("started thread %p %p %p %p %p %p", arg, &local_clib,
_impure_ptr, thread, thread->function, thread->arg); _impure_ptr, thread, thread->function, thread->arg);
// call the user's thread // call the user's thread
@ -2394,7 +2265,7 @@ pthread_getschedparam (pthread_t thread, int *policy,
return 0; return 0;
} }
/* Thread SpecificData */ /* Thread Specific Data */
extern "C" int extern "C" int
pthread_key_create (pthread_key_t *key, void (*destructor) (void *)) pthread_key_create (pthread_key_t *key, void (*destructor) (void *))
{ {

View File

@ -22,106 +22,16 @@ details. */
#define WRITE_LOCK 1 #define WRITE_LOCK 1
#define READ_LOCK 2 #define READ_LOCK 2
extern "C"
{
#if defined (_CYG_THREAD_FAILSAFE) && defined (_MT_SAFE)
void AssertResourceOwner (int, int);
#else
#define AssertResourceOwner(i,ii)
#endif
}
#ifndef _MT_SAFE
#define SetResourceLock(i,n,c)
#define ReleaseResourceLock(i,n,c)
#else
#include <pthread.h> #include <pthread.h>
#include <limits.h> #include <limits.h>
#include <errno.h>
#include <signal.h>
#include <pwd.h>
#include <grp.h>
#include <security.h> #include <security.h>
#define _NOMNTENT_FUNCS #include <errno.h>
#include <mntent.h>
extern "C" extern "C"
{ {
struct _winsup_t
{
/*
Needed for the group functions
*/
struct __group16 _grp;
char *_namearray[2];
int _grp_pos;
/* console.cc */
unsigned _rarg;
/* dlfcn.cc */
int _dl_error;
char _dl_buffer[256];
/* passwd.cc */
struct passwd _res;
char _pass[_PASSWORD_LEN];
int _pw_pos;
/* path.cc */
struct mntent mntbuf;
int _iteration;
DWORD available_drives;
char mnt_type[80];
char mnt_opts[80];
char mnt_fsname[CYG_MAX_PATH];
char mnt_dir[CYG_MAX_PATH];
/* strerror */
char _strerror_buf[20];
/* sysloc.cc */
char *_process_ident;
int _process_logopt;
int _process_facility;
int _process_logmask;
/* times.cc */
char timezone_buf[20];
struct tm _localtime_buf;
/* uinfo.cc */
char _username[UNLEN + 1];
/* net.cc */
char *_ntoa_buf;
struct protoent *_protoent_buf;
struct servent *_servent_buf;
struct hostent *_hostent_buf;
};
struct __reent_t
{
struct _reent *_clib;
struct _winsup_t *_winsup;
void init_clib (_reent&);
};
_winsup_t *_reent_winsup ();
void SetResourceLock (int, int, const char *) __attribute__ ((regparm (3))); void SetResourceLock (int, int, const char *) __attribute__ ((regparm (3)));
void ReleaseResourceLock (int, int, const char *) void ReleaseResourceLock (int, int, const char *)
__attribute__ ((regparm (3))); __attribute__ ((regparm (3)));
#ifdef _CYG_THREAD_FAILSAFE
void AssertResourceOwner (int, int);
#else
#define AssertResourceOwner(i,ii)
#endif
} }
class fast_mutex class fast_mutex
@ -173,16 +83,9 @@ class pinfo;
class ResourceLocks class ResourceLocks
{ {
public: public:
ResourceLocks ()
{
}
LPCRITICAL_SECTION Lock (int); LPCRITICAL_SECTION Lock (int);
void Init (); void Init ();
void Delete (); void Delete ();
#ifdef _CYG_THREAD_FAILSAFE
DWORD owner;
DWORD count;
#endif
private: private:
CRITICAL_SECTION lock; CRITICAL_SECTION lock;
bool inited; bool inited;
@ -770,36 +673,22 @@ struct MTinterface
int concurrency; int concurrency;
long int threadcount; long int threadcount;
// Used for main thread data, and sigproc thread
struct __reent_t reents;
struct _winsup_t winsup_reent;
callback *pthread_prepare; callback *pthread_prepare;
callback *pthread_child; callback *pthread_child;
callback *pthread_parent; callback *pthread_parent;
pthread_key reent_key;
pthread_key thread_self_key;
void Init (); void Init ();
void fixup_before_fork (void); void fixup_before_fork (void);
void fixup_after_fork (void); void fixup_after_fork (void);
#if 1 // avoid initialization since zero is implied and #if 0 // avoid initialization since zero is implied and
// only use of this class is static
MTinterface () : reent_key (NULL), thread_self_key (NULL) {}
#else
MTinterface () : MTinterface () :
concurrency (0), threadcount (0), concurrency (0), threadcount (0),
pthread_prepare (NULL), pthread_child (NULL), pthread_parent (NULL), pthread_prepare (NULL), pthread_child (NULL), pthread_parent (NULL)
reent_key (NULL), thread_self_key (NULL)
{ {
} }
#endif #endif
}; };
#define MT_INTERFACE user_data->threadinterface #define MT_INTERFACE user_data->threadinterface
#endif // MT_SAFE
#endif // _CYGNUS_THREADS_ #endif // _CYGNUS_THREADS_

View File

@ -21,6 +21,7 @@ details. */
#include "fhandler.h" #include "fhandler.h"
#include "pinfo.h" #include "pinfo.h"
#include "hires.h" #include "hires.h"
#include "cygtls.h"
#define FACTOR (0x19db1ded53e8000LL) #define FACTOR (0x19db1ded53e8000LL)
#define NSPERSEC 10000000LL #define NSPERSEC 10000000LL
@ -118,11 +119,7 @@ settimeofday (const struct timeval *tv, const struct timezone *tz)
extern "C" char * extern "C" char *
timezone () timezone ()
{ {
#ifdef _MT_SAFE char *b = _my_tls.locals.timezone_buf;
char *b=_reent_winsup ()->timezone_buf;
#else
static NO_COPY char b[20] = {0};
#endif
tzset (); tzset ();
__small_sprintf (b,"GMT%+d:%02d", (int) (-_timezone / 3600), (int) (abs (_timezone / 60) % 60)); __small_sprintf (b,"GMT%+d:%02d", (int) (-_timezone / 3600), (int) (abs (_timezone / 60) % 60));
@ -332,11 +329,7 @@ corelocaltime (const time_t * tim_p)
int y; int y;
int yleap; int yleap;
_CONST int *ip; _CONST int *ip;
#ifdef _MT_SAFE struct tm &localtime_buf=_my_tls.locals.localtime_buf;
struct tm &localtime_buf=_reent_winsup ()->_localtime_buf;
#else
static NO_COPY struct tm localtime_buf = {0};
#endif
time_t tim = *tim_p; time_t tim = *tim_p;
struct tm *res = &localtime_buf; struct tm *res = &localtime_buf;

View File

@ -1,18 +1,20 @@
//;# autogenerated: Do not edit. //;# autogenerated: Do not edit.
//; $tls::func = -620; //; $tls::func = -3084;
//; $tls::saved_errno = -616; //; $tls::saved_errno = -3080;
//; $tls::sa_flags = -612; //; $tls::sa_flags = -3076;
//; $tls::oldmask = -608; //; $tls::oldmask = -3072;
//; $tls::newmask = -604; //; $tls::newmask = -3068;
//; $tls::event = -600; //; $tls::event = -3064;
//; $tls::errno_addr = -596; //; $tls::errno_addr = -3060;
//; $tls::initialized = -592; //; $tls::initialized = -3056;
//; $tls::sigmask = -588; //; $tls::sigmask = -3052;
//; $tls::sigwait_mask = -584; //; $tls::sigwait_mask = -3048;
//; $tls::sigwait_info = -580; //; $tls::sigwait_info = -3044;
//; $tls::infodata = -576; //; $tls::infodata = -3040;
//; $tls::tid = -52; //; $tls::tid = -2516;
//; $tls::local_clib = -2512;
//; $tls::locals = -1584;
//; $tls::prev = -48; //; $tls::prev = -48;
//; $tls::next = -44; //; $tls::next = -44;
//; $tls::stack = -40; //; $tls::stack = -40;
@ -20,19 +22,21 @@
//; $tls::stackptr = -4; //; $tls::stackptr = -4;
//; __DATA__ //; __DATA__
#define tls_func (-620) #define tls_func (-3084)
#define tls_saved_errno (-616) #define tls_saved_errno (-3080)
#define tls_sa_flags (-612) #define tls_sa_flags (-3076)
#define tls_oldmask (-608) #define tls_oldmask (-3072)
#define tls_newmask (-604) #define tls_newmask (-3068)
#define tls_event (-600) #define tls_event (-3064)
#define tls_errno_addr (-596) #define tls_errno_addr (-3060)
#define tls_initialized (-592) #define tls_initialized (-3056)
#define tls_sigmask (-588) #define tls_sigmask (-3052)
#define tls_sigwait_mask (-584) #define tls_sigwait_mask (-3048)
#define tls_sigwait_info (-580) #define tls_sigwait_info (-3044)
#define tls_infodata (-576) #define tls_infodata (-3040)
#define tls_tid (-52) #define tls_tid (-2516)
#define tls_local_clib (-2512)
#define tls_locals (-1584)
#define tls_prev (-48) #define tls_prev (-48)
#define tls_next (-44) #define tls_next (-44)
#define tls_stack (-40) #define tls_stack (-40)

View File

@ -180,13 +180,7 @@ uinfo_init ()
extern "C" char * extern "C" char *
getlogin (void) getlogin (void)
{ {
#ifdef _MT_SAFE return strcpy (_my_tls.locals.username, cygheap->user.name ());
char *this_username=_reent_winsup ()->_username;
#else
static char this_username[UNLEN + 1] NO_COPY;
#endif
return strcpy (this_username, cygheap->user.name ());
} }
extern "C" __uid32_t extern "C" __uid32_t