diff options
author | Christopher Faylor <me@cgf.cx> | 2005-12-29 20:46:34 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2005-12-29 20:46:34 +0000 |
commit | 5d97040501505d37b01268fdf335ef6ea2bafb44 (patch) | |
tree | 2764464e535cc8ec94122a853743e5583f2b0c95 /winsup/cygwin/init.cc | |
parent | 10e4168d8441980eeec3a5d3ce7f5a6052c3ee27 (diff) | |
download | cygnal-5d97040501505d37b01268fdf335ef6ea2bafb44.tar.gz cygnal-5d97040501505d37b01268fdf335ef6ea2bafb44.tar.bz2 cygnal-5d97040501505d37b01268fdf335ef6ea2bafb44.zip |
*** cygwin DLL Changes:
* child_info.h (CURR_CHILD_INFO_MAGIC): Reset.
(child_info::dwProcessId): Delete.
(child_info::straced): New variable.
(child_info::handle_fork): New member function.
* dcrt0.cc (in_forkee): New global variable.
(__cygwin_user_data::forkee): Mark as obsolete.
(do_global_ctors): Use in_forkee rather than user_data->forkee.
(get_cygwin_startup_info): Ditto. Deal with new straced field to allow strace
to deal with children of attached processes.
(initial_env): Accommodate changes to strace::hello.
(child_info_fork::handle_fork): Rename from plain old 'handle_fork'. Move
alloc_stack() call elsewhere.
(dll_crt0_0): Fill out more of user_data. Reference handle_fork via fork_info.
Add some debugging output.
(_dll_crt0): Don't wait for sync thread if sync_startup is invalid. Zero
sync_startup here. Call alloc_stack() here, if appropriate.
(dll_crt0_1): Use in_forkee rather than user_data->forkee.
(dll_crt0): Ditto.
* malloc_wrapper.cc (malloc_init): Ditto.
* dll_init.cc (in_forkee): Remove local static version of this variable.
(dll_list::load_after_fork): Don't set in_forkee here.
* external.cc (cygwin_internal): Use strace method rather than accessing field
directly.
* fhandler.cc (fhandler_base::read): Ditto.
* fhandler_tty.cc (fhandler_tty_common::__acquire_output_mutex): Ditto.
* fork.cc (frok::parent): Invoke strace write_childpid to communicate with
potential strace.
(child_copy): Add more detail to debugging output.
* init.cc (calibration_id): New static variable.
(prime_threads): Set sync_startup to invalid handle if we already know about
thread_func_ix. Use static calibration_id to hold calibration thread id.
* munge_threadfunc (munge_threadfunc): Don't try to debug if we don't find
threadfunc_ix.
(dll_entry): Avoid calling munge_threadfunc and _cygtls::remove on non-cygwin
threads invoked during process startup.
* pinfo.cc (set_myself): Always call strace.hello here regardless of DEBUGGING.
* sigproc.cc (child_info::child_info): Remove spurious handling of dwProcessId.
Set straced as appropriate.
* spawn.cc (spawn_guts): Rename ciresrv to ch. Invoke strace write_childpid to
communicate with potential strace.
* strace.cc: Include child_info.h.
(strace::hello): Remove inited test. Use active() method to test if strace has
been activated. Handle case where we are started before
(mypid): New function.
(strace::vsprntf): Try to deal more intelligently with case where progname may
not be filled out. Put pid in parentheses if it is a windows pid rather than a
cygwin pid. myself has been filled out.
(strace::write_childpid): New function for notifying strace about the creation
of children.
(strace::vprntf): Use strace method rather than accessing field directly.
(strace_printf): Ditto.
(strace::wm): Ditto.
* winsup.h (in_forkee): Declare.
* include/sys/strace.h (strace::write_childpid): Declare new function.
(strace::attached): Define new function.
(strace::active): Ditto.
(strace::active_val): Ditto.
(_STRACE_ON): Delete.
(_STRACE_OFF): Ditto.
(define_strace0): Use strace method rather than accessing field directly.
(strace_printf_wrap): Ditto.
(strace_printf_wrap1): Ditto.
*** cygwin utils changes:
* strace.cc (nprocesses): Make static global.
(quiet): New variable.
(strace_active): Ditto.
(add_child): Increment nprocesses here. Don't add a child if it is already
added (windows bug?). Report on child if not quiet.
(get_child): Just return NULL if child not found.
(remove_child): Report on child if not quiet.
(attach_process): Don't complain if given a windows process. Use windows pid
in error.
(handle_output_debug_string): Issue error if trying to manipulate a process
that we don't know about. Handle _STRACE_CHILD_PID - attach to reported child
when we get this.
(proc_child): Move nprocesses to file scope. Report on exceptions.
(longopts): Implement "--quiet".
(opts): Implement "-q".
(main): Manipulate quiet flag.
* utils.sgml (strace): Add words describing '-q'.
Diffstat (limited to 'winsup/cygwin/init.cc')
-rw-r--r-- | winsup/cygwin/init.cc | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc index 59a0cae30..037b6c795 100644 --- a/winsup/cygwin/init.cc +++ b/winsup/cygwin/init.cc @@ -41,6 +41,8 @@ calibration_thread (VOID *arg) ExitThread (0); } +static DWORD calibration_id; + /* We need to know where the OS stores the address of the thread function on the stack so that we can intercept the call and insert some tls stuff on the stack. This function starts a known calibration thread. @@ -50,11 +52,12 @@ calibration_thread (VOID *arg) static void prime_threads () { - if (!threadfunc_ix[0]) + if (threadfunc_ix[0]) + sync_startup = INVALID_HANDLE_VALUE; + else { - DWORD id; search_for = (char *) calibration_thread; - sync_startup = CreateThread (NULL, 0, calibration_thread, 0, 0, &id); + sync_startup = CreateThread (NULL, 0, calibration_thread, 0, 0, &calibration_id); } } @@ -72,7 +75,7 @@ munge_threadfunc () for (peb = ebp, i = 0; peb < top && i < 7; peb++) if (*peb == search_for) threadfunc_ix[i++] = peb - ebp; - if (!threadfunc_ix[0]) + if (0 && !threadfunc_ix[0]) { try_to_debug (); return; @@ -82,7 +85,7 @@ munge_threadfunc () char *threadfunc = ebp[threadfunc_ix[0]]; if (threadfunc == (char *) calibration_thread) /* no need for the overhead */; - else + else if (threadfunc_ix[0]) { for (i = 0; threadfunc_ix[i]; i++) ebp[threadfunc_ix[i]] = (char *) threadfunc_fe; @@ -166,10 +169,12 @@ dll_entry (HANDLE h, DWORD reason, void *static_load) case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: - munge_threadfunc (); + if (!sync_startup || GetCurrentThreadId () == calibration_id) + munge_threadfunc (); break; case DLL_THREAD_DETACH: - _my_tls.remove (0); + if (!sync_startup) + _my_tls.remove (0); break; } |