From 5e0f482f2cac33d5ce758e4dc0f665a4e195f4e1 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Mon, 26 Jan 2004 18:52:02 +0000 Subject: [PATCH] * cygtls.cc (_threadinfo::init_thread): Add more local reent stdio initialization. * dcrt0.cc (initial_env): Can it really be true that XP doesn't allow attaching a debugger during DLL attach? Add temporary workaround. (dll_crt0_0): Ensure that _impure_ptr stdio is initialized before any threads. (dll_crt0_1): Move _impure_ptr initialization to dll_crt0_0. * exceptions.cc (try_to_debug): Reinstate old method for looping while debugging. * syscalls.cc (_cygwin_istext_for_stdio): Regularize debugging output. Remove hopefully extraneous check. (setmode_helper): Add debugging output for improbable case. Use "binary" rather "raw" for consistency. --- winsup/cygwin/ChangeLog | 16 ++++++++++++++++ winsup/cygwin/cygtls.cc | 2 ++ winsup/cygwin/dcrt0.cc | 19 ++++++++++++------- winsup/cygwin/exceptions.cc | 3 ++- winsup/cygwin/syscalls.cc | 25 ++++++++++++++----------- 5 files changed, 46 insertions(+), 19 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 664c053e0..bfc201968 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,19 @@ +2004-01-26 Christopher Faylor + + * cygtls.cc (_threadinfo::init_thread): Add more local reent stdio + initialization. + * dcrt0.cc (initial_env): Can it really be true that XP doesn't allow + attaching a debugger during DLL attach? Add temporary workaround. + (dll_crt0_0): Ensure that _impure_ptr stdio is initialized before any + threads. + (dll_crt0_1): Move _impure_ptr initialization to dll_crt0_0. + * exceptions.cc (try_to_debug): Reinstate old method for looping while + debugging. + * syscalls.cc (_cygwin_istext_for_stdio): Regularize debugging output. + Remove hopefully extraneous check. + (setmode_helper): Add debugging output for improbable case. Use + "binary" rather "raw" for consistency. + 2004-01-25 Christopher Faylor * fhandler.cc (fhandler_base::fhaccess): Avoid always setting errno to diff --git a/winsup/cygwin/cygtls.cc b/winsup/cygwin/cygtls.cc index 4833b58d2..a74412637 100644 --- a/winsup/cygwin/cygtls.cc +++ b/winsup/cygwin/cygtls.cc @@ -108,6 +108,8 @@ _threadinfo::init_thread (void *x, DWORD (*func) (void *, void *)) local_clib._stderr = _GLOBAL_REENT->_stderr; local_clib.__sdidinit = _GLOBAL_REENT->__sdidinit; local_clib.__cleanup = _GLOBAL_REENT->__cleanup; + local_clib.__sglue._niobs = 3; + local_clib.__sglue._iobs = &_GLOBAL_REENT->__sf[0]; } local_clib._current_locale = "C"; locals.process_logmask = LOG_UPTO (LOG_DEBUG); diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 6a08261c1..0cc5b96c6 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -547,8 +547,13 @@ initial_env (bool first) #ifdef DEBUGGING DWORD len; static bool NO_COPY did_debugging_stuff; +#if 0 if (did_debugging_stuff || (first && wincap.cant_debug_dll_entry ())) return; +#else + if (first) + return; +#endif did_debugging_stuff = true; if (GetEnvironmentVariable ("CYGWIN_SLEEP", buf, sizeof (buf) - 1)) @@ -757,10 +762,7 @@ dll_crt0_1 (char *) /* Initialize pthread mainthread when not forked and it is safe to call new, otherwise it is reinitalized in fixup_after_fork */ if (!user_data->forkee) - { - __sinit (_impure_ptr); - pthread::init_mainthread (); - } + pthread::init_mainthread (); #ifdef DEBUGGING strace.microseconds (); @@ -938,15 +940,18 @@ _dll_crt0 () main_environ = user_data->envptr; *main_environ = NULL; - if (child_proc_info && child_proc_info->type == _PROC_FORK) - user_data->forkee = child_proc_info->cygpid; - char padding[CYGTLS_PADSIZE]; _impure_ptr = &reent_data; _impure_ptr->_stdin = &_impure_ptr->__sf[0]; _impure_ptr->_stdout = &_impure_ptr->__sf[1]; _impure_ptr->_stderr = &_impure_ptr->__sf[2]; _impure_ptr->_current_locale = "C"; + + if (child_proc_info && child_proc_info->type == _PROC_FORK) + user_data->forkee = child_proc_info->cygpid; + else + __sinit (_impure_ptr); + initialize_main_tls (padding); dll_crt0_1 (padding); } diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 96e05e247..db70fa51d 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -383,7 +383,8 @@ try_to_debug (bool waitloop) return 1; SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE); while (!being_debugged ()) - low_priority_sleep (0); + Sleep (0); + Sleep (2000); small_printf ("*** continuing pid %u from debugger call\n", cygwin_pid (GetCurrentProcessId ())); } diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 16486d9a9..f2b0881ee 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -1599,33 +1599,34 @@ ctermid (char *str) extern "C" int _cygwin_istext_for_stdio (int fd) { - syscall_printf ("_cygwin_istext_for_stdio (%d)", fd); if (CYGWIN_VERSION_OLD_STDIO_CRLF_HANDLING) { - syscall_printf (" _cifs: old API"); + syscall_printf ("fd %d: old API", fd); return 0; /* we do it for old apps, due to getc/putc macros */ } cygheap_fdget cfd (fd, false, false); if (cfd < 0) { - syscall_printf (" _cifs: fd not open"); + syscall_printf ("fd %d: not open", fd); return 0; } +#if 0 if (cfd->get_device () != FH_FS) { - syscall_printf (" _cifs: fd not disk file"); + syscall_printf ("fd not disk file. Defaulting to binary."); return 0; } +#endif if (cfd->get_w_binary () || cfd->get_r_binary ()) { - syscall_printf (" _cifs: get_*_binary"); + syscall_printf ("fd %d: opened as binary", fd); return 0; } - syscall_printf ("_cygwin_istext_for_stdio says yes"); + syscall_printf ("fd %d: defaulting to text", fd); return 1; } @@ -1639,10 +1640,12 @@ static int setmode_helper (FILE *f) { if (fileno (f) != setmode_file) - return 0; - syscall_printf ("setmode: file was %s now %s", - f->_flags & __SCLE ? "text" : "raw", - setmode_mode & O_TEXT ? "text" : "raw"); + { + syscall_printf ("improbable, but %d != %d", fileno (f), setmode_file); + return 0; + } + syscall_printf ("file was %s now %s", f->_flags & __SCLE ? "text" : "binary", + setmode_mode & O_TEXT ? "text" : "binary"); if (setmode_mode & O_TEXT) f->_flags |= __SCLE; else @@ -1700,7 +1703,7 @@ setmode (int fd, int mode) setmode_file = fd; _fwalk (_REENT, setmode_helper); - syscall_printf ("setmode (%d<%s>, %p) returns %s", fd, cfd->get_name (), + syscall_printf ("(%d<%s>, %p) returning %s", fd, cfd->get_name (), mode, res & O_TEXT ? "text" : "binary"); return res; }