cygthread::cygthread() hang

Joe Buehler jbuehler@hekimian.com
Wed Apr 2 20:23:00 GMT 2003


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



More information about the Cygwin-developers mailing list