This is the mail archive of the
cygwin-developers@cygwin.com
mailing list for the Cygwin project.
cygthread::cygthread() hang
- From: Joe Buehler <jbuehler at hekimian dot com>
- To: Cygwin Developers <cygwin-developers at cygwin dot com>
- Date: Wed, 02 Apr 2003 15:23:48 -0500
- Subject: cygthread::cygthread() hang
- Organization: Spirent Communications, Inc.
- Reply-to: jbuehler at hekimian dot com
Here's another hang, this time in the cygthread constructor.
The hang shows up in emacs sometimes when a subprocess is run.
(This might be what an emacs user has reported recently on the
main mailing list.) Strace shows the main thread stuck in this routine:
cygthread::cygthread (LPTHREAD_START_ROUTINE start, LPVOID param,
const char *name): func (start), arg (param)
The "sig" thread is trying to send a SIGCHLD and cannot. I presume that
this is because the main thread has locked something that prevents
signals from being delivered.
Strace on the emacs process shows an infinite repeat of this:
91 1519400614 [sig] emacs 219 wait_sig: awake
101 1519400715 [sig] emacs 219 wait_sig: processing signal 20
84 1519400799 [sig] emacs 219 wait_sig: Got signal 20
83 1519400882 [sig] emacs 219 sig_handle: signal 20
87 1519400969 [sig] emacs 219 sig_handle: signal 20, about to call 0x201216FC
90 1519401059 [sig] emacs 219 sig_dispatch_pending: pending_signals 1
91 1519401150 [sig] emacs 219 sig_dispatch_pending: woke up wait_sig
116 1519401266 [sig] emacs 219 setup_handler: couldn't send signal 20
93 1519401359 [sig] emacs 219 setup_handler: returning 0
88 1519401447 [sig] emacs 219 sig_handle: returning 0
90 1519401537 [sig] emacs 219 proc_subproc: args: 3, 0
953 1519402490 [sig] emacs 219 proc_subproc: looking for processes to reap
199 1519402689 [sig] emacs 219 proc_subproc: finished processing terminated/stopped child
95 1519402784 [sig] emacs 219 proc_subproc: returning 1
89 1519402873 [sig] emacs 219 wait_sig: looping
99 1519402972 [sig] emacs 219 wait_sig: awake
83 1519403055 [sig] emacs 219 wait_sig: processing signal 20
85 1519403140 [sig] emacs 219 wait_sig: Got signal 20
85 1519403225 [sig] emacs 219 sig_handle: signal 20
84 1519403309 [sig] emacs 219 sig_handle: signal 20, about to call 0x201216FC
88 1519403397 [sig] emacs 219 sig_dispatch_pending: pending_signals 1
85 1519403482 [sig] emacs 219 sig_dispatch_pending: woke up wait_sig
-11057 1519392425 [main] emacs 219 cygthread::cygthread: waiting for (null)<0x0> to become active
11452 1519403877 [sig] emacs 219 setup_handler: couldn't send signal 20
120 1519403997 [sig] emacs 219 setup_handler: returning 0
90 1519404087 [sig] emacs 219 sig_handle: returning 0
93 1519404180 [sig] emacs 219 proc_subproc: args: 3, 0
89 1519404269 [sig] emacs 219 proc_subproc: looking for processes to reap
90 1519404359 [sig] emacs 219 proc_subproc: finished processing terminated/stopped child
89 1519404448 [sig] emacs 219 proc_subproc: returning 1
91 1519404539 [sig] emacs 219 wait_sig: looping
Here is where the main thread is hung:
while (!h)
#ifndef DEBUGGING
low_priority_sleep (0);
#else
{
system_printf ("waiting for %s<%p> to become active", __name, h);
low_priority_sleep (0);
}
Both __name and h are null. The null h is a little odd. It looks to me
as if cygthread::new() has allocated a cygthread that has no associated
windows thread, and is in an infinite loop because of this.
What looks odd to me is that there is a path in cygthread::new() that
does not set h. Here is the code in cygthread::new().
/* Search the threads array for an empty slot to use */
for (info = threads; info < threads + NTHREADS; info++)
if ((id = (DWORD) InterlockedExchange ((LPLONG) &info->avail, 0)))
{
#ifdef DEBUGGING
if (info->__name)
api_fatal ("name not NULL? id %p, i %d", id, info - threads);
#endif
goto out;
}
else if (!info->id)
{
info->h = CreateThread (&sec_none_nih, 0, cygthread::stub, info,
CREATE_SUSPENDED, &info->id);
goto out;
}
Is there a problem here because h is not initialized? Is the strace message
perhaps a debugging aid to catch this case?
--
Joe Buehler