diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 5d0cbd138..329d163b3 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2011-12-08 Christopher Faylor + + * dll_init.cc (dll_dllcrt0): Don't try to initialize dll data if we're + dynamically loaded since fork() doesn't work in that scenario anyway. + (dll_dllcrt0_1): Don't accommodate dynamically loaded dlls. + * exceptions.cc (ctrl_c_handler): Don't lock the process; there's too + much risk of deadlock. + * sigproc.cc (_cygtls::remove_wq): Don't try to remove anything from + the waitq if there is obviously nothing there. + * strace.cc (strace::activate): Allow stracing dynamically loaded + cygwin1.dll. + 2011-12-07 Christopher Faylor * fhandler_termios.cc (tty_min::kill_pgrp): Don't send __SIGSETPGRP diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc index 12896e2ef..8a72ecee6 100644 --- a/winsup/cygwin/dll_init.cc +++ b/winsup/cygwin/dll_init.cc @@ -546,12 +546,10 @@ struct dllcrt0_info extern "C" int dll_dllcrt0 (HMODULE h, per_process *p) { + if (dynamically_loaded) + return 1; dllcrt0_info x (h, p); - - if (_my_tls.isinitialized ()) - dll_dllcrt0_1 (&x); - else - _my_tls.call ((DWORD (*) (void *, void *)) dll_dllcrt0_1, &x); + dll_dllcrt0_1 (&x); return x.res; } @@ -592,11 +590,7 @@ dll_dllcrt0_1 (VOID *x) However, that's just a note for the record; at the moment, we can't see any need to worry about this happening. */ - /* Partially initialize Cygwin guts for non-cygwin apps. */ - if (dynamically_loaded && user_data->magic_biscuit == 0) - dll_crt0 (p); - else - check_sanity_and_sync (p); + check_sanity_and_sync (p); dll_type type; diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 019c585ef..b16e8162a 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -927,7 +927,6 @@ static BOOL WINAPI ctrl_c_handler (DWORD type) { static bool saw_close; - lock_process now; if (!cygwin_finished_initializing) { diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 0031f73b0..8ddc047e4 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -346,7 +346,7 @@ out1: void _cygtls::remove_wq (DWORD wait) { - if (exit_state < ES_FINAL && sync_proc_subproc + if (exit_state < ES_FINAL && waitq_head.next && sync_proc_subproc && sync_proc_subproc.acquire (wait)) { for (waitq *w = &waitq_head; w->next != NULL; w = w->next) diff --git a/winsup/cygwin/strace.cc b/winsup/cygwin/strace.cc index 120ba32c3..49b4c5ab9 100644 --- a/winsup/cygwin/strace.cc +++ b/winsup/cygwin/strace.cc @@ -34,7 +34,7 @@ class strace NO_COPY strace; void strace::activate (bool isfork) { - if (!dynamically_loaded && !_active && being_debugged ()) + if (!_active && being_debugged ()) { char buf[30]; __small_sprintf (buf, "cYg%8x %x %d", _STRACE_INTERFACE_ACTIVATE_ADDR, &_active, isfork);