From 29d52c8a27ec621dea1c8229c26b60fe12bc3e16 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Tue, 23 Dec 2003 16:26:31 +0000 Subject: * 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. --- winsup/cygwin/ChangeLog | 72 ++++++++++++++++- winsup/cygwin/Makefile.in | 21 +++-- winsup/cygwin/acconfig.h | 6 -- winsup/cygwin/config.h.in | 66 ++++++++------- winsup/cygwin/configure | 123 ++++++++++++---------------- winsup/cygwin/configure.in | 14 ---- winsup/cygwin/cygtls.h | 83 +++++++++++++++++-- winsup/cygwin/cygwin.din | 1 - winsup/cygwin/dcrt0.cc | 66 ++++++++------- winsup/cygwin/dlfcn.cc | 14 ++-- winsup/cygwin/dtable.cc | 1 - winsup/cygwin/errno.cc | 10 +-- winsup/cygwin/exceptions.cc | 114 +++----------------------- winsup/cygwin/external.cc | 1 + winsup/cygwin/fork.cc | 14 +++- winsup/cygwin/gentls_offsets | 8 +- winsup/cygwin/grp.cc | 14 ++-- winsup/cygwin/hires.h | 1 - winsup/cygwin/include/cygwin/version.h | 3 +- winsup/cygwin/init.cc | 5 +- winsup/cygwin/libc/bsdlib.cc | 2 + winsup/cygwin/net.cc | 89 ++++++++------------- winsup/cygwin/passwd.cc | 16 ++-- winsup/cygwin/path.cc | 82 ++++++++++--------- winsup/cygwin/pinfo.cc | 1 + winsup/cygwin/pwdgrp.h | 1 + winsup/cygwin/sigproc.cc | 22 ++++- winsup/cygwin/sigproc.h | 2 +- winsup/cygwin/syscalls.cc | 4 +- winsup/cygwin/syslog.cc | 66 ++++++--------- winsup/cygwin/thread.cc | 141 ++------------------------------- winsup/cygwin/thread.h | 117 +-------------------------- winsup/cygwin/times.cc | 13 +-- winsup/cygwin/tlsoffsets.h | 56 +++++++------ winsup/cygwin/uinfo.cc | 8 +- 35 files changed, 513 insertions(+), 744 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index da333b3..7f09dd2 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,4 +1,74 @@ -2003-12-17 Christopher Faylor +2003-12-23 Christopher Faylor + + * 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 + + * path.cc (mount_item::build_win32): Take path apart before feeding it + to fnmunge. + +2003-12-21 Christopher Faylor + + 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 * sigproc.cc (proc_subproc): Simplify code to just remove all zombies if SIGCHLD == SIG_IGN. diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in index 502934d..742a2e2 100644 --- a/winsup/cygwin/Makefile.in +++ b/winsup/cygwin/Makefile.in @@ -118,9 +118,9 @@ DLL_IMPORTS:=$(w32api_lib)/libkernel32.a MT_SAFE_OBJECTS:= # 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 \ - debug.o delqueue.o devices.o dir.o dlfcn.o dll_init.o dtable.o environ.o \ - errno.o exceptions.o exec.o external.o fcntl.o fhandler.o \ +DLL_OFILES:=assert.o autoload.o bsdlib.o cxx.o cygheap.o cygthread.o cygtls.o \ + dcrt0.o debug.o delqueue.o devices.o dir.o dlfcn.o dll_init.o dtable.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_dsp.o fhandler_fifo.o fhandler_floppy.o fhandler_mem.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)}" "" 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 -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_clipboard_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_serial_CFLAGS:=-fomit-frame-pointer fhandler_socket_CFLAGS:=-fomit-frame-pointer +fhandler_syslog_CFLAGS:=-fomit-frame-pointer fhandler_tape_CFLAGS:=-fomit-frame-pointer fhandler_termios_CFLAGS:=-fomit-frame-pointer fhandler_tty_CFLAGS:=-fomit-frame-pointer fhandler_virtual_CFLAGS:=-fomit-frame-pointer fhandler_windows_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 regerror_CFLAGS=-fomit-frame-pointer regexec_CFLAGS=-fomit-frame-pointer regfree_CFLAGS=-fomit-frame-pointer +shared_CFLAGS:=-fomit-frame-pointer +smallprint_CFLAGS:=-fomit-frame-pointer endif .PHONY: all force dll_ofiles install all_target install_target all_host install_host \ diff --git a/winsup/cygwin/acconfig.h b/winsup/cygwin/acconfig.h index 36aee46..53ac1fc 100644 --- a/winsup/cygwin/acconfig.h +++ b/winsup/cygwin/acconfig.h @@ -1,18 +1,12 @@ /* Define if DEBUGGING support is requested. */ #undef DEBUGGING -/* Define if building "extra" thread-safe Cygwin DLL. */ -#undef _CYG_THREAD_FAILSAFE - /* Define if GCC supports builtin memset. */ #undef HAVE_BUILTIN_MEMSET /* Define if MALLOC_DEBUGGING support is requested. */ #undef MALLOC_DEBUG -/* Define if building thread-safe Cygwin DLL. */ -#undef _MT_SAFE - /* Define if using new vfork functionality. */ #undef NEWVFORK diff --git a/winsup/cygwin/config.h.in b/winsup/cygwin/config.h.in index b4d4467..68cd418 100644 --- a/winsup/cygwin/config.h.in +++ b/winsup/cygwin/config.h.in @@ -1,33 +1,7 @@ -/* config.h.in. Generated automatically 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 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 - +/* config.h.in. Generated from configure.in by autoheader. */ /* Define if DEBUGGING support is requested. */ #undef DEBUGGING -/* Define if building "extra" thread-safe Cygwin DLL. */ -#undef _CYG_THREAD_FAILSAFE - /* Define if GCC supports builtin memset. */ #undef HAVE_BUILTIN_MEMSET @@ -39,3 +13,41 @@ /* Define if using cygserver */ #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 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 diff --git a/winsup/cygwin/configure b/winsup/cygwin/configure index 2773536..418dee1 100755 --- a/winsup/cygwin/configure +++ b/winsup/cygwin/configure @@ -12,8 +12,6 @@ ac_help= ac_default_prefix=/usr/local # 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 --enable-debugging Build a cygwin DLL which has more consistency checking for debugging" ac_help="$ac_help --enable-server Build a cygwin DLL which can communicate with cygserver" @@ -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" # ./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 "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 eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then 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 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 case "$host_alias" in @@ -673,7 +671,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$host" 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 case "$target_alias" in @@ -691,7 +689,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$target" 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 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. set dummy ${ac_tool_prefix}gcc; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy gcc; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy cc; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -840,7 +838,7 @@ fi fi 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -849,7 +847,7 @@ else yes; #endif 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 else ac_cv_prog_gcc=no @@ -864,7 +862,7 @@ if test $ac_cv_prog_gcc = yes; then ac_save_CFLAGS="$CFLAGS" CFLAGS= 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -894,7 +892,7 @@ fi # 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 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy g++; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy c++; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1018,7 +1016,7 @@ EOF # 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 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy ar; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1085,7 +1083,7 @@ fi # 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 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy as; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1152,7 +1150,7 @@ fi # 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 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy ranlib; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1219,7 +1217,7 @@ fi # 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 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy ld; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1286,7 +1284,7 @@ fi # 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 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy nm; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1353,7 +1351,7 @@ fi # 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 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy dlltool; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1420,7 +1418,7 @@ fi # 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 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 echo $ac_n "(cached) $ac_c" 1>&6 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. set dummy windres; ac_word=$2 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1486,7 +1484,7 @@ fi 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. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1501,13 +1499,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF 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}\$"` if test -z "$ac_err"; then : @@ -1518,13 +1516,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF 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}\$"` if test -z "$ac_err"; then : @@ -1535,13 +1533,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF 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}\$"` 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 # for constant arguments. Useless! 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 echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } 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* ac_cv_header_alloca_h=yes else @@ -1601,12 +1599,12 @@ EOF fi 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 echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&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* ac_cv_func_alloca_works=yes else @@ -1666,12 +1664,12 @@ EOF 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 echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do 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 echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&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* eval "ac_cv_func_$ac_func=yes" else @@ -1751,7 +1749,7 @@ done fi 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 echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1759,7 +1757,7 @@ else ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext <&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 ac_cv_c_stack_direction=1 else @@ -1800,7 +1798,7 @@ EOF fi 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_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then 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 cat > conftest.$ac_ext < @@ -1850,7 +1848,7 @@ int main() { ; return 0; } 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* use_builtin_memset=yes 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 -# 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. if test "${enable_debugging+set}" = set; then enableval="$enable_debugging" diff --git a/winsup/cygwin/configure.in b/winsup/cygwin/configure.in index 351284e..c1fab43 100644 --- a/winsup/cygwin/configure.in +++ b/winsup/cygwin/configure.in @@ -117,20 +117,6 @@ if test $use_builtin_memset = "yes"; then fi 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, [ --enable-debugging Build a cygwin DLL which has more consistency checking for debugging], [case "${enableval}" in diff --git a/winsup/cygwin/cygtls.h b/winsup/cygwin/cygtls.h index 29f2103..846bac5 100644 --- a/winsup/cygwin/cygtls.h +++ b/winsup/cygwin/cygtls.h @@ -9,16 +9,83 @@ details. */ #ifndef _CYGTLS_H #define _CYGTLS_H -#include +#include +#include +#include +#include +#define _NOMNTENT_FUNCS +#include +#undef _NOMNTENT_FUNCS #define CYGTLS_INITIALIZED 0x43227 #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 acompanying changes to the very simple parser in the perl script 'gentls_offsets' (<<-- start parsing here). */ -#pragma pack(push,4) typedef __uint32_t __stack_t; struct _threadinfo { @@ -35,6 +102,8 @@ struct _threadinfo siginfo_t *sigwait_info; siginfo_t infodata; struct pthread *tid; + struct _reent local_clib; + struct _local_storage locals; struct _threadinfo *prev, *next; __stack_t stack[8]; int sig; @@ -43,9 +112,9 @@ struct _threadinfo /*gentls_offsets*/ static CRITICAL_SECTION protect_linked_list; static void init (); - void init_thread (void *); - static void call (DWORD (*) (void *, void *), void *); - void call2 (DWORD (*) (void *, void *), void *, void *); + void init_thread (void *) __attribute__ ((regparm (2))); + static void call (DWORD (*) (void *, void *), void *) __attribute__ ((regparm (3))); + static void call2 (DWORD (*) (void *, void *), void *, void *) __attribute__ ((regparm (3))); static struct _threadinfo *find_tls (int sig); void remove (); void push (__stack_t, bool = false); @@ -67,5 +136,7 @@ extern char *_tlstop __asm__ ("%fs:8"); #define _my_tls (((_threadinfo *) _tlsbase)[-1]) extern _threadinfo *_main_tls; -#define CYGTLS_PADSIZE (sizeof (_threadinfo) + 64) +#define __getreent() (&_my_tls.local_clib) + +#define CYGTLS_PADSIZE (sizeof (_threadinfo)) #endif /*_CYGTLS_H*/ diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 0611076..9524bb0 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -24,7 +24,6 @@ opterr DATA optind DATA optopt DATA optreset DATA -reent_data DATA _alloca NOSIGFE dll_entry@12 NOSIGFE __assert SIGFE diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 72161f9..6314806 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -10,6 +10,7 @@ details. */ #include "winsup.h" #include +#include #include #include "glob.h" #include "exceptions.h" @@ -89,7 +90,6 @@ extern "C" char ***main_environ; /* __progname used in getopt error message */ char *__progname; - struct _reent reent_data = _REENT_INIT(reent_data); struct per_process __cygwin_user_data = {/* initial_sp */ 0, /* magic_biscuit */ 0, /* dll_major */ CYGWIN_VERSION_DLL_MAJOR, @@ -110,7 +110,7 @@ extern "C" /* api_minor */ CYGWIN_VERSION_API_MINOR, /* unused2 */ {0, 0, 0, 0, 0}, /* resourcelocks */ &_reslock, /* threadinterface */ &_mtinterf, - /* impure_ptr */ &reent_data, + /* impure_ptr */ NULL, }; bool ignore_case_with_glob; int __declspec (dllexport) _check_for_executable = true; @@ -136,25 +136,18 @@ do_global_dtors (void) static void __stdcall do_global_ctors (void (**in_pfunc)(), int force) { - if (!force) - { - if (user_data->forkee || user_data->run_ctors_p) - return; // inherit constructed stuff from parent pid - user_data->run_ctors_p = 1; - } + if (!force && user_data->forkee) + return; // inherit constructed stuff from parent pid /* Run ctors backwards, so skip the first entry and find how many there are, then run them. */ - void (**pfunc)() = in_pfunc; + void (**pfunc) () = in_pfunc; while (*++pfunc) ; while (--pfunc > in_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 cygwin app via LoadLibrary. */ 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 be on the stack. */ /* 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 pass in the per_process struct into the .dll from libccrt0). */ - _impure_ptr = &reent_data; - user_data->resourcelocks->Init (); user_data->threadinterface->Init (); @@ -771,15 +758,16 @@ dll_crt0_1 () /* Disable case-insensitive globbing */ 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); MALLOC_CHECK; 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) exit (user_data->main (__argc, __argv, *user_data->envptr)); } @@ -830,6 +818,21 @@ initial_env () _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 two symbols with the same name, but different addresses. @@ -840,7 +843,7 @@ extern "C" void __stdcall _dll_crt0 () { 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; main_environ = user_data->envptr; @@ -859,7 +862,8 @@ _dll_crt0 () GetStartupInfo (&si); child_proc_info = (child_info *) si.lpReserved2; 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; else { @@ -901,19 +905,20 @@ _dll_crt0 () break; } } - - _threadinfo::init (); - dll_crt0_1 (); + + user_data->impure_ptr = _impure_ptr = initialize_main_tls (zeros); + dll_crt0_1 (zeros); } void dll_crt0 (per_process *uptr) { + char padding[CYGTLS_PADSIZE]; /* Set the local copy of the pointer into the user space. */ if (uptr && uptr != user_data) { 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 (); } @@ -937,13 +942,14 @@ cygwin_dll_init () user_data->envptr = &envp; user_data->fmode_ptr = &_fmode; - dll_crt0_1 (); + dll_crt0_1 (NULL); } extern "C" void __main (void) { do_global_ctors (user_data->ctors, false); + atexit (do_global_dtors); } exit_states NO_COPY exit_state; diff --git a/winsup/cygwin/dlfcn.cc b/winsup/cygwin/dlfcn.cc index 3032cc4..2bc987f 100644 --- a/winsup/cygwin/dlfcn.cc +++ b/winsup/cygwin/dlfcn.cc @@ -21,15 +21,13 @@ details. */ #include "dlfcn.h" #include "dll_init.h" #include "cygerrno.h" - -#define _dl_error _reent_winsup ()->_dl_error -#define _dl_buffer _reent_winsup ()->_dl_buffer +#include "cygtls.h" static void __stdcall set_dl_error (const char *str) { - __small_sprintf (_dl_buffer, "%s: %E", str); - _dl_error = 1; + __small_sprintf (_my_tls.locals.dl_buffer, "%s: %E", str); + _my_tls.locals.dl_error = 1; } /* Look for an executable file given the name and the environment @@ -145,12 +143,12 @@ char * dlerror () { char *res; - if (!_dl_error) + if (!_my_tls.locals.dl_error) res = NULL; else { - _dl_error = 0; - res = _dl_buffer; + _my_tls.locals.dl_error = 0; + res = _my_tls.locals.dl_buffer; } return res; } diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index c6c300b..b4c5db0 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -200,7 +200,6 @@ dtable::delete_archetype (fhandler_base *fh) int dtable::find_unused_handle (int start) { - AssertResourceOwner (LOCK_FD_LIST, READ_LOCK); do { for (size_t i = start; i < size; i++) diff --git a/winsup/cygwin/errno.cc b/winsup/cygwin/errno.cc index cbe31d0..b04a32c 100644 --- a/winsup/cygwin/errno.cc +++ b/winsup/cygwin/errno.cc @@ -15,6 +15,7 @@ details. */ #include #include "cygerrno.h" #include "thread.h" +#include "cygtls.h" #undef _sys_nerr #undef sys_nerr #undef _sys_errlist @@ -681,13 +682,8 @@ strerror (int errnum) error = "Value too large for defined data type"; break; default: -#ifdef _MT_SAFE - char *buf= _reent_winsup ()->_strerror_buf; -#else - static NO_COPY char buf[20]; -#endif - __small_sprintf (buf, "error %d", errnum); - error = buf; + __small_sprintf (_my_tls.locals.strerror_buf, "error %d", errnum); + error = _my_tls.locals.strerror_buf; break; } diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index ffa6d4d..ee55091 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -36,11 +36,6 @@ static int handle_exceptions (EXCEPTION_RECORD *, void *, CONTEXT *, void *); 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 HANDLE hExeced; @@ -129,101 +124,6 @@ init_exceptions (exception_list *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 error_start_init (const char *buf) { @@ -663,9 +563,9 @@ handle_sigsuspend (sigset_t tempmask) sig_dispatch_pending (); 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. - sigproc_printf ("old mask %x, new mask %x", oldmask, tempmask); + sigproc_printf ("oldmask %p, newmask %p", oldmask, tempmask); pthread_testcancel (); pthread::cancelable_wait (signal_arrived, INFINITE); @@ -974,20 +874,24 @@ set_process_mask (sigset_t newmask) /* Set the signal mask for this process. Note that some signals are unmaskable, as in UNIX. */ 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); 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 mask_sync->release (); - if (oldmask & ~newmask) + if (mask_bits) sig_dispatch_pending (); else sigproc_printf ("not calling sig_dispatch_pending"); return; } +extern _threadinfo *_last_thread; + _threadinfo * _threadinfo::find_tls (int sig) { diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc index c209104..07b58b2 100644 --- a/winsup/cygwin/external.cc +++ b/winsup/cygwin/external.cc @@ -27,6 +27,7 @@ details. */ #include "heap.h" #include "cygthread.h" #include "pwdgrp.h" +#include "cygtls.h" static external_pinfo * fillout_pinfo (pid_t pid, int winpid) diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 66f83a0..63ba7ab 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -263,7 +263,8 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls) if (fork_info->stacksize) { _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); @@ -553,13 +554,22 @@ fork_parent (HANDLE& hParent, dll *&first_dll, 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", user_data->data_start, user_data->data_end, user_data->bss_start, user_data->bss_end, cygheap->user_heap.base, cygheap->user_heap.ptr, stack_here, ch.stackbottom, 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_CHECK; diff --git a/winsup/cygwin/gentls_offsets b/winsup/cygwin/gentls_offsets index 26432b3..434707b 100755 --- a/winsup/cygwin/gentls_offsets +++ b/winsup/cygwin/gentls_offsets @@ -6,7 +6,11 @@ my $struct = ''; my @fields = (); my $def = ''; my $tls = join('', ); -$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; foreach ($tls =~ /^.*\n/mg) { $def .= $_ if $struct; @@ -32,11 +36,13 @@ foreach ($tls =~ /^.*\n/mg) { close TLS; open(TMP, '>', "/tmp/$$.cc") or die "$0: couldn't open temporary index file \"/tmp/$$.c\" - $!\n"; print TMP < #include #include typedef void *HANDLE; +$pre $def int main(int argc, char **argv) diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc index c185b26..ab0ef57 100644 --- a/winsup/cygwin/grp.cc +++ b/winsup/cygwin/grp.cc @@ -24,9 +24,7 @@ details. */ #include "cygerrno.h" #include "cygheap.h" #include "pwdgrp.h" - -/* Position in the group cache */ -#define grp_pos _reent_winsup ()->_grp_pos +#include "cygtls.h" static __group32 *group_buf; static pwdgrp gr (group_buf); @@ -208,16 +206,16 @@ getgrnam (const char *name) extern "C" void endgrent () { - grp_pos = 0; + _my_tls.locals.grp_pos = 0; } extern "C" struct __group32 * getgrent32 () { - if (grp_pos == 0) + if (_my_tls.locals.grp_pos == 0) gr.refresh (true); - if (grp_pos < gr.curr_lines) - return group_buf + grp_pos++; + if (_my_tls.locals.grp_pos < gr.curr_lines) + return group_buf + _my_tls.locals.grp_pos++; return NULL; } @@ -233,7 +231,7 @@ getgrent () extern "C" void setgrent () { - grp_pos = 0; + _my_tls.locals.grp_pos = 0; } /* Internal function. ONLY USE THIS INTERNALLY, NEVER `getgrent'!!! */ diff --git a/winsup/cygwin/hires.h b/winsup/cygwin/hires.h index df4c44c..2c9f09c 100644 --- a/winsup/cygwin/hires.h +++ b/winsup/cygwin/hires.h @@ -27,7 +27,6 @@ class hires_base int inited; public: virtual LONGLONG usecs (bool justdelta) {return 0LL;} - virtual ~hires_base () {} }; class hires_us : hires_base diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 246e7a4..be6d392 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -232,12 +232,13 @@ details. */ 105: Export sigwait. 106: Export flock. 107: Export fcntl64. + 108: Remove unused (hopefully) reent_data export. */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #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 shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc index 94453f6..9b7201c 100644 --- a/winsup/cygwin/init.cc +++ b/winsup/cygwin/init.cc @@ -51,14 +51,13 @@ dll_entry (HANDLE h, DWORD reason, void *static_load) switch (reason) { case DLL_PROCESS_ATTACH: - _my_tls.stackptr = _my_tls.stack; dynamically_loaded = (static_load == NULL); + __cygwin_user_data.impure_ptr = &_my_tls.local_clib; + _my_tls.stackptr = _my_tls.stack; break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: - if (MT_INTERFACE->reent_key.set (&MT_INTERFACE->reents)) - api_fatal ("thread initialization failed"); munge_threadfunc (h); break; } diff --git a/winsup/cygwin/libc/bsdlib.cc b/winsup/cygwin/libc/bsdlib.cc index b0f8dbb..4de52f2 100644 --- a/winsup/cygwin/libc/bsdlib.cc +++ b/winsup/cygwin/libc/bsdlib.cc @@ -40,6 +40,8 @@ #include #include #include "cygerrno.h" +#include "thread.h" +#include "cygtls.h" extern "C" int daemon (int nochdir, int noclose) diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index ac62fec..1973d89 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -36,6 +36,7 @@ details. */ #include "pinfo.h" #include "registry.h" #include "wsock_event.h" +#include "cygtls.h" extern "C" { @@ -175,22 +176,16 @@ dump_protoent (struct protoent *p) extern "C" char * 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); - if (ntoa_buf) + if (_my_tls.locals.ntoa_buf) { - free (ntoa_buf); - ntoa_buf = NULL; + free (_my_tls.locals.ntoa_buf); + _my_tls.locals.ntoa_buf = NULL; } if (res) - ntoa_buf = strdup (res); - return ntoa_buf; + _my_tls.locals.ntoa_buf = strdup (res); + return _my_tls.locals.ntoa_buf; } /* exported as inet_addr: BSD 4.3 */ @@ -587,38 +582,34 @@ dup_ent (void *old, void *src0, struct_type type) return dst; } -#ifdef _MT_SAFE -#define protoent_buf _reent_winsup ()->_protoent_buf -#else -static struct protoent *protoent_buf = NULL; -#endif - /* exported as getprotobyname: standards? */ extern "C" struct protoent * cygwin_getprotobyname (const char *p) { if (check_null_str_errno (p)) return NULL; - protoent_buf = (protoent *) dup_ent (protoent_buf, getprotobyname (p), - is_protoent); - if (!protoent_buf) + _my_tls.locals.protoent_buf = + (protoent *) dup_ent (_my_tls.locals.protoent_buf, getprotobyname (p), + is_protoent); + if (!_my_tls.locals.protoent_buf) set_winsock_errno (); - dump_protoent (protoent_buf); - return protoent_buf; + dump_protoent (_my_tls.locals.protoent_buf); + return _my_tls.locals.protoent_buf; } /* exported as getprotobynumber: standards? */ extern "C" struct protoent * cygwin_getprotobynumber (int number) { - protoent_buf = (protoent *) dup_ent (protoent_buf, getprotobynumber (number), - is_protoent); - if (!protoent_buf) + _my_tls.locals.protoent_buf = + (protoent *) dup_ent (_my_tls.locals.protoent_buf, + getprotobynumber (number), is_protoent); + if (!_my_tls.locals.protoent_buf) set_winsock_errno (); - dump_protoent (protoent_buf); - return protoent_buf; + dump_protoent (_my_tls.locals.protoent_buf); + return _my_tls.locals.protoent_buf; } bool @@ -936,12 +927,6 @@ cygwin_connect (int fd, const struct sockaddr *name, int namelen) return res; } -#ifdef _MT_SAFE -#define servent_buf _reent_winsup ()->_servent_buf -#else -static struct servent *servent_buf = NULL; -#endif - /* exported as getservbyname: standards? */ extern "C" struct servent * 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))) 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); - if (!servent_buf) + if (!_my_tls.locals.servent_buf) set_winsock_errno (); - syscall_printf ("%x = getservbyname (%s, %s)", servent_buf, name, proto); - return servent_buf; + syscall_printf ("%x = getservbyname (%s, %s)", _my_tls.locals.servent_buf, name, proto); + return _my_tls.locals.servent_buf; } /* exported as getservbyport: standards? */ @@ -968,13 +953,13 @@ cygwin_getservbyport (int port, const char *proto) if (proto != NULL && check_null_str_errno (proto)) 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); - if (!servent_buf) + if (!_my_tls.locals.servent_buf) set_winsock_errno (); - syscall_printf ("%x = getservbyport (%d, %s)", servent_buf, port, proto); - return servent_buf; + syscall_printf ("%x = getservbyport (%d, %s)", _my_tls.locals.servent_buf, port, proto); + return _my_tls.locals.servent_buf; } extern "C" int @@ -999,12 +984,6 @@ cygwin_gethostname (char *name, size_t len) return 0; } -#ifdef _MT_SAFE -#define hostent_buf _reent_winsup ()->_hostent_buf -#else -static struct hostent *hostent_buf = NULL; -#endif - /* exported as gethostbyname: standards? */ extern "C" struct hostent * cygwin_gethostbyname (const char *name) @@ -1036,19 +1015,19 @@ cygwin_gethostbyname (const char *name) 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); - if (!hostent_buf) + if (!_my_tls.locals.hostent_buf) { set_winsock_errno (); set_host_errno (); } 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; } - return hostent_buf; + return _my_tls.locals.hostent_buf; } /* 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)) 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), is_hostent); - if (!hostent_buf) + if (!_my_tls.locals.hostent_buf) { set_winsock_errno (); set_host_errno (); } 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; } - return hostent_buf; + return _my_tls.locals.hostent_buf; } /* exported as accept: standards? */ diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc index 7a76e5a..536f4ae 100644 --- a/winsup/cygwin/passwd.cc +++ b/winsup/cygwin/passwd.cc @@ -26,12 +26,8 @@ details. */ on the first call that needs information from it. */ passwd *passwd_buf; -/* FIXME: This really should use a constructor, but they are slow */ static pwdgrp pr (passwd_buf); -/* Position in the passwd cache */ -#define pw_pos _reent_winsup ()->_pw_pos - /* Parse /etc/passwd line into passwd structure. */ bool 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 * getpwent (void) { - if (pw_pos == 0) + if (_my_tls.locals.pw_pos == 0) pr.refresh (true); - if (pw_pos < pr.curr_lines) - return passwd_buf + pw_pos++; + if (_my_tls.locals.pw_pos < pr.curr_lines) + return passwd_buf + _my_tls.locals.pw_pos++; return NULL; } @@ -271,13 +267,13 @@ getpwduid (__uid16_t) extern "C" void setpwent (void) { - pw_pos = 0; + _my_tls.locals.pw_pos = 0; } extern "C" void endpwent (void) { - pw_pos = 0; + _my_tls.locals.pw_pos = 0; } extern "C" int @@ -289,7 +285,7 @@ setpassent () extern "C" char * getpass (const char * prompt) { - char *pass=_reent_winsup ()->_pass; + char *pass = _my_tls.locals.pass; struct termios ti, newti; cygheap_fdget fhstdin (0); diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index d801a66..0f60be4 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -72,16 +72,9 @@ details. */ #include "cygheap.h" #include "shared_info.h" #include "registry.h" +#include "cygtls.h" #include -#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 void slashify (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) { int name_type; - if (!(flags & MOUNT_ENC) || !(name_type = special_name (src))) + if (!(name_type = special_name (src))) strcpy (dst, src); else { @@ -1286,7 +1279,25 @@ mount_item::build_win32 (char *dst, const char *src, unsigned *outflags, unsigne /* nothing */; else if ((!(flags & MOUNT_ENC) && isdrive (dst) && !dst[2]) || *p) 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 @@ -2234,18 +2245,14 @@ mount_info::del_item (const char *path, unsigned flags, int reg_p) static mntent * fillout_mntent (const char *native_path, const char *posix_path, unsigned flags) { -#ifdef _MT_SAFE - struct mntent &ret=_reent_winsup ()->mntbuf; -#else - static NO_COPY struct mntent ret; -#endif + struct mntent& ret=_my_tls.locals.mntbuf; /* Remove drivenum from list if we see a x: style path */ if (strlen (native_path) == 2 && native_path[1] == ':') { int drivenum = cyg_tolower (native_path[0]) - 'a'; 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 @@ -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 from the getmntent user's point of view. */ - strcpy (_reent_winsup ()->mnt_fsname, native_path); - ret.mnt_fsname = _reent_winsup ()->mnt_fsname; - strcpy (_reent_winsup ()->mnt_dir, posix_path); - ret.mnt_dir = _reent_winsup ()->mnt_dir; + strcpy (_my_tls.locals.mnt_fsname, native_path); + ret.mnt_fsname = _my_tls.locals.mnt_fsname; + strcpy (_my_tls.locals.mnt_dir, posix_path); + ret.mnt_dir = _my_tls.locals.mnt_dir; if (!(flags & MOUNT_SYSTEM)) /* user mount */ - strcpy (_reent_winsup ()->mnt_type, (char *) "user"); + strcpy (_my_tls.locals.mnt_type, (char *) "user"); 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 binary or textmode, or exec. We don't print `silent' here; it's a magic internal thing. */ if (!(flags & MOUNT_BINARY)) - strcpy (_reent_winsup ()->mnt_opts, (char *) "textmode"); + strcpy (_my_tls.locals.mnt_opts, (char *) "textmode"); else - strcpy (_reent_winsup ()->mnt_opts, (char *) "binmode"); + strcpy (_my_tls.locals.mnt_opts, (char *) "binmode"); 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) - strcat (_reent_winsup ()->mnt_opts, (char *) ",exec"); + strcat (_my_tls.locals.mnt_opts, (char *) ",exec"); else if (flags & MOUNT_NOTEXEC) - strcat (_reent_winsup ()->mnt_opts, (char *) ",noexec"); + strcat (_my_tls.locals.mnt_opts, (char *) ",noexec"); if (flags & MOUNT_ENC) - strcat (_reent_winsup ()->mnt_opts, ",managed"); + strcat (_my_tls.locals.mnt_opts, ",managed"); if ((flags & MOUNT_CYGDRIVE)) /* cygdrive */ - strcat (_reent_winsup ()->mnt_opts, (char *) ",noumount"); - - ret.mnt_opts = _reent_winsup ()->mnt_opts; + strcat (_my_tls.locals.mnt_opts, (char *) ",noumount"); + ret.mnt_opts = _my_tls.locals.mnt_opts; ret.mnt_freq = 1; ret.mnt_passno = 1; @@ -2307,16 +2313,16 @@ cygdrive_getmntent () DWORD mask = 1, drive = 'a'; struct mntent *ret = NULL; - while (available_drives) + while (_my_tls.locals.available_drives) { for (/* nothing */; drive <= 'z'; mask <<= 1, drive++) - if (available_drives & mask) + if (_my_tls.locals.available_drives & mask) break; __small_sprintf (native_path, "%c:\\", drive); if (GetFileAttributes (native_path) == INVALID_FILE_ATTRIBUTES) { - available_drives &= ~mask; + _my_tls.locals.available_drives &= ~mask; continue; } native_path[2] = '\0'; @@ -2425,15 +2431,15 @@ cygwin_umount (const char *path, unsigned flags) extern "C" FILE * setmntent (const char *filep, const char *) { - iteration = 0; - available_drives = GetLogicalDrives (); + _my_tls.locals.iteration = 0; + _my_tls.locals.available_drives = GetLogicalDrives (); return (FILE *) filep; } extern "C" struct mntent * getmntent (FILE *) { - return mount_table->getmntent (iteration++); + return mount_table->getmntent (_my_tls.locals.iteration++); } extern "C" int diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 805f96b..581e2fb 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -257,6 +257,7 @@ pinfo::set_acl() void _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)) { ctty = tc->ntty; diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h index b9093d8..c579fc4 100644 --- a/winsup/cygwin/pwdgrp.h +++ b/winsup/cygwin/pwdgrp.h @@ -22,6 +22,7 @@ extern struct __group32 *internal_getgrent (int); int internal_getgroups (int, __gid32_t *, cygpsid * = NULL); #include "sync.h" +#include "cygtls.h" class pwdgrp { unsigned pwdgrp_buf_elem_size; diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 0f4431f..227a25b 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -588,8 +588,17 @@ int __stdcall sig_dispatch_pending () { 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); return call_signal_handler_now (); } @@ -1155,8 +1164,15 @@ wait_sig (VOID *self) sig_clear (-pack.sig); else { - if (sig_handle (pack.sig, *pack.mask, pack.pid, pack.tls) <= 0) - sigqueue.add (pack.sig, pack.pid, pack.tls);// FIXME: Shouldn't add this in !sh condition + int sigres = sig_handle (pack.sig, *pack.mask, pack.pid, pack.tls); + 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) proc_subproc (PROC_CLEARWAIT, 0); } diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h index 30ce799..f34dfa2 100644 --- a/winsup/cygwin/sigproc.h +++ b/winsup/cygwin/sigproc.h @@ -54,7 +54,7 @@ extern HANDLE sigCONT; bool __stdcall my_parent_is_alive (); int __stdcall sig_dispatch_pending (); #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 int __stdcall handle_sigprocmask (int sig, const sigset_t *set, sigset_t *oldset, sigset_t& opmask) diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index cf60e11..2b2e97d 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -319,7 +319,9 @@ setsid (void) /* 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) { diff --git a/winsup/cygwin/syslog.cc b/winsup/cygwin/syslog.cc index c0a34ca..c053c22 100644 --- a/winsup/cygwin/syslog.cc +++ b/winsup/cygwin/syslog.cc @@ -21,6 +21,7 @@ details. */ #include "cygerrno.h" #include "cygheap.h" #include "thread.h" +#include "cygtls.h" /* FIXME: These should probably be in the registry. */ /* FIXME: The Win95 path should be whatever slash is */ @@ -38,50 +39,31 @@ get_win95_event_log_path () return WIN95_EVENT_LOG_PATH; } -/* FIXME: For MT safe code these will need to be replaced */ - -#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. - */ +/* openlog: save the passed args. Don't open the + system log (NT) or log file (95) yet. */ extern "C" void openlog (const char *ident, int logopt, int facility) { debug_printf ("openlog called with (%s, %d, %d)", ident ? ident : "", logopt, facility); - if (process_ident != NULL) + if (_my_tls.locals.process_ident != NULL) { - free (process_ident); - process_ident = 0; + free (_my_tls.locals.process_ident); + _my_tls.locals.process_ident = 0; } if (ident) { - process_ident = (char *) malloc (strlen (ident) + 1); - if (process_ident == NULL) + _my_tls.locals.process_ident = (char *) malloc (strlen (ident) + 1); + 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; } - strcpy (process_ident, ident); + strcpy (_my_tls.locals.process_ident, ident); } - process_logopt = logopt; - process_facility = facility; + _my_tls.locals.process_logopt = logopt; + _my_tls.locals.process_facility = facility; } /* setlogmask: set the log priority mask and return previous mask. @@ -90,16 +72,16 @@ int setlogmask (int maskpri) { if (maskpri == 0) - return process_logmask; + return _my_tls.locals.process_logmask; - int old_mask = process_logmask; - process_logmask = maskpri & LOG_PRIMASK; + int old_mask = _my_tls.locals.process_logmask; + _my_tls.locals.process_logmask = maskpri & LOG_PRIMASK; return old_mask; } -/* Private class used to handle formatting of syslog message */ -/* It is named pass_handler because it does a two-pass handling of log +/* Private class used to handle formatting of syslog message + 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 one builds the string. */ @@ -211,10 +193,10 @@ vsyslog (int priority, const char *message, va_list ap) { debug_printf ("%x %s", priority, message); /* 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", - priority, process_logmask); + priority, _my_tls.locals.process_logmask); return; } @@ -290,12 +272,12 @@ vsyslog (int priority, const char *message, va_list ap) pass.set_message ((char *) alloca (n)); /* 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; } - if (process_logopt & LOG_PID) + if (_my_tls.locals.process_logopt & LOG_PID) { if (pass.print ("PID %u : ", getpid ()) == -1) return; @@ -353,8 +335,8 @@ vsyslog (int priority, const char *message, va_list ap) if (wincap.has_eventlog ()) { /* For NT, open the event log and send the message */ - HANDLE hEventSrc = RegisterEventSourceA (NULL, (process_ident != NULL) ? - process_ident : CYGWIN_LOG_NAME); + HANDLE hEventSrc = RegisterEventSourceA (NULL, (_my_tls.locals.process_ident != NULL) ? + _my_tls.locals.process_ident : CYGWIN_LOG_NAME); if (hEventSrc == NULL) { debug_printf ("RegisterEventSourceA failed with %E"); diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index ca2e3bf..fe460a1 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -34,7 +34,6 @@ details. */ #include "cygerrno.h" #include #include -#include #include "pinfo.h" #include "sigproc.h" #include "perprocess.h" @@ -48,112 +47,36 @@ details. */ extern int threadsafe; +#undef __getreent extern "C" struct _reent * __getreent () { - 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 _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; + return &_my_tls.local_clib; } inline LPCRITICAL_SECTION 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; } void 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)); - -#ifdef _CYG_THREAD_FAILSAFE - user_data->resourcelocks->owner = GetCurrentThreadId (); - user_data->resourcelocks->count++; -#endif } void 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)); } -#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 ResourceLocks::Init () { InitializeCriticalSection (&lock); inited = true; - -#ifdef _CYG_THREAD_FAILSAFE - owner = 0; - count = 0; -#endif - thread_printf ("lock %p inited by %p , %d", &lock, user_data, myself->pid); } @@ -171,11 +94,6 @@ ResourceLocks::Delete () void 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_cond::init_mutex (); pthread_rwlock::init_mutex (); @@ -193,14 +111,6 @@ MTinterface::fixup_after_fork (void) { 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; pthread::init_mainthread (); @@ -232,7 +142,6 @@ pthread::init_mainthread () GetCurrentProcess (), &thread->win32_obj_id, 0, FALSE, DUPLICATE_SAME_ACCESS)) api_fatal ("failed to create mainthread handle"); - thread->set_tls_self_pointer (); if (!thread->create_cancel_event ()) api_fatal ("couldn't create cancel event for main thread"); thread->postcreate (); @@ -247,20 +156,12 @@ pthread::self () return pthread_null::get_null_pthread (); } -void -pthread::set_tls_self_pointer () -{ - MT_INTERFACE->thread_self_key.set (this); -} - pthread * pthread::get_tls_self_pointer () { - return (pthread *) MT_INTERFACE->thread_self_key.get (); + return _my_tls.tid; } - - List pthread::threads; /* member methods */ @@ -1876,18 +1777,6 @@ verifyable_object_isvalid (void const * objectptr, long magic) 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 pthread::thread_init_wrapper (void *arg) { @@ -1897,32 +1786,14 @@ pthread::thread_init_wrapper (void *arg) exception_list cygwin_except_entry; 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 (); + // if thread is detached force cleanup on exit if (thread->attr.joinable == PTHREAD_CREATE_DETACHED && thread->joiner == NULL) thread->joiner = thread; thread->mutex.unlock (); -#ifdef _CYG_THREAD_FAILSAFE - 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, + thread_printf ("started thread %p %p %p %p %p %p", arg, &_my_tls.local_clib, _impure_ptr, thread, thread->function, thread->arg); // call the user's thread @@ -2394,7 +2265,7 @@ pthread_getschedparam (pthread_t thread, int *policy, return 0; } -/* Thread SpecificData */ +/* Thread Specific Data */ extern "C" int pthread_key_create (pthread_key_t *key, void (*destructor) (void *)) { diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h index 4e94cbb..ed79b8d 100644 --- a/winsup/cygwin/thread.h +++ b/winsup/cygwin/thread.h @@ -22,106 +22,16 @@ details. */ #define WRITE_LOCK 1 #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 #include -#include -#include -#include -#include #include -#define _NOMNTENT_FUNCS -#include +#include 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 ReleaseResourceLock (int, int, const char *) __attribute__ ((regparm (3))); - -#ifdef _CYG_THREAD_FAILSAFE -void AssertResourceOwner (int, int); -#else -#define AssertResourceOwner(i,ii) -#endif } class fast_mutex @@ -173,16 +83,9 @@ class pinfo; class ResourceLocks { public: - ResourceLocks () - { - } LPCRITICAL_SECTION Lock (int); void Init (); void Delete (); -#ifdef _CYG_THREAD_FAILSAFE - DWORD owner; - DWORD count; -#endif private: CRITICAL_SECTION lock; bool inited; @@ -770,36 +673,22 @@ struct MTinterface int concurrency; 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_child; callback *pthread_parent; - pthread_key reent_key; - pthread_key thread_self_key; - void Init (); void fixup_before_fork (void); void fixup_after_fork (void); -#if 1 // avoid initialization since zero is implied and - // only use of this class is static - MTinterface () : reent_key (NULL), thread_self_key (NULL) {} -#else +#if 0 // avoid initialization since zero is implied and MTinterface () : concurrency (0), threadcount (0), - pthread_prepare (NULL), pthread_child (NULL), pthread_parent (NULL), - reent_key (NULL), thread_self_key (NULL) + pthread_prepare (NULL), pthread_child (NULL), pthread_parent (NULL) { } #endif }; #define MT_INTERFACE user_data->threadinterface - -#endif // MT_SAFE - #endif // _CYGNUS_THREADS_ diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc index 2def51f..46e0243 100644 --- a/winsup/cygwin/times.cc +++ b/winsup/cygwin/times.cc @@ -21,6 +21,7 @@ details. */ #include "fhandler.h" #include "pinfo.h" #include "hires.h" +#include "cygtls.h" #define FACTOR (0x19db1ded53e8000LL) #define NSPERSEC 10000000LL @@ -118,11 +119,7 @@ settimeofday (const struct timeval *tv, const struct timezone *tz) extern "C" char * timezone () { -#ifdef _MT_SAFE - char *b=_reent_winsup ()->timezone_buf; -#else - static NO_COPY char b[20] = {0}; -#endif + char *b = _my_tls.locals.timezone_buf; tzset (); __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 yleap; _CONST int *ip; -#ifdef _MT_SAFE - struct tm &localtime_buf=_reent_winsup ()->_localtime_buf; -#else - static NO_COPY struct tm localtime_buf = {0}; -#endif + struct tm &localtime_buf=_my_tls.locals.localtime_buf; time_t tim = *tim_p; struct tm *res = &localtime_buf; diff --git a/winsup/cygwin/tlsoffsets.h b/winsup/cygwin/tlsoffsets.h index d7abe83..bd6036a 100644 --- a/winsup/cygwin/tlsoffsets.h +++ b/winsup/cygwin/tlsoffsets.h @@ -1,18 +1,20 @@ //;# autogenerated: Do not edit. -//; $tls::func = -620; -//; $tls::saved_errno = -616; -//; $tls::sa_flags = -612; -//; $tls::oldmask = -608; -//; $tls::newmask = -604; -//; $tls::event = -600; -//; $tls::errno_addr = -596; -//; $tls::initialized = -592; -//; $tls::sigmask = -588; -//; $tls::sigwait_mask = -584; -//; $tls::sigwait_info = -580; -//; $tls::infodata = -576; -//; $tls::tid = -52; +//; $tls::func = -3084; +//; $tls::saved_errno = -3080; +//; $tls::sa_flags = -3076; +//; $tls::oldmask = -3072; +//; $tls::newmask = -3068; +//; $tls::event = -3064; +//; $tls::errno_addr = -3060; +//; $tls::initialized = -3056; +//; $tls::sigmask = -3052; +//; $tls::sigwait_mask = -3048; +//; $tls::sigwait_info = -3044; +//; $tls::infodata = -3040; +//; $tls::tid = -2516; +//; $tls::local_clib = -2512; +//; $tls::locals = -1584; //; $tls::prev = -48; //; $tls::next = -44; //; $tls::stack = -40; @@ -20,19 +22,21 @@ //; $tls::stackptr = -4; //; __DATA__ -#define tls_func (-620) -#define tls_saved_errno (-616) -#define tls_sa_flags (-612) -#define tls_oldmask (-608) -#define tls_newmask (-604) -#define tls_event (-600) -#define tls_errno_addr (-596) -#define tls_initialized (-592) -#define tls_sigmask (-588) -#define tls_sigwait_mask (-584) -#define tls_sigwait_info (-580) -#define tls_infodata (-576) -#define tls_tid (-52) +#define tls_func (-3084) +#define tls_saved_errno (-3080) +#define tls_sa_flags (-3076) +#define tls_oldmask (-3072) +#define tls_newmask (-3068) +#define tls_event (-3064) +#define tls_errno_addr (-3060) +#define tls_initialized (-3056) +#define tls_sigmask (-3052) +#define tls_sigwait_mask (-3048) +#define tls_sigwait_info (-3044) +#define tls_infodata (-3040) +#define tls_tid (-2516) +#define tls_local_clib (-2512) +#define tls_locals (-1584) #define tls_prev (-48) #define tls_next (-44) #define tls_stack (-40) diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc index 33835b2..81dd7f4 100644 --- a/winsup/cygwin/uinfo.cc +++ b/winsup/cygwin/uinfo.cc @@ -180,13 +180,7 @@ uinfo_init () extern "C" char * getlogin (void) { -#ifdef _MT_SAFE - char *this_username=_reent_winsup ()->_username; -#else - static char this_username[UNLEN + 1] NO_COPY; -#endif - - return strcpy (this_username, cygheap->user.name ()); + return strcpy (_my_tls.locals.username, cygheap->user.name ()); } extern "C" __uid32_t -- cgit v1.1