On Nov 22 14:37, Christian Franke wrote:
> Corinna Vinschen wrote:
> > On Nov 20 22:00, Takashi Yano wrote:
> > > On Tue, 19 Nov 2024 11:51:17 +0100
> > > Corinna Vinschen wrote:
> > > > Maybe we can utilize WaitOnAddress, kind of like this?
> > > > 
> > > > sigwait_common, just the fallthrough snippet:
> > > > 
> > > >    +       /* sigpacket::process() already started.
> > > >    +          Go through to WAIT_SIGNALED case. */
> > > >    +       _my_tls.unlock ();
> > > >    +       sigset_t compare = 0;
> > > >    +       WaitOnAddress (&_my_tls.sigwait_mask, &compare,
> > > >    +                      sizeof (sigset_t), INFINITE);
> > > >    +       _my_tls.sigwait_mask = 0;
> > > >    +       fallthrough;
> > > > 
> > > > sigpacket::process():
> > > > 
> > > > @@ -1457,6 +1457,7 @@ sigpacket::process ()
> > > >     bool issig_wait = false;
> > > >     struct sigaction& thissig = global_sigs[si.si_signo];
> > > >     void *handler = have_execed ? NULL : (void *) thissig.sa_handler;
> > > > +  sigset_t orig_wait_mask = 0;
> > > >     threadlist_t *tl_entry = NULL;
> > > >     _cygtls *tls = NULL;
> > > > @@ -1527,11 +1528,15 @@ sigpacket::process ()
> > > >     if ((HANDLE) *tls)
> > > >       tls->signal_debugger (si);
> > > > -  if (issig_wait)
> > > > +  tls->lock ();
> > > > +  if (issig_wait && tls->sigwait_mask != 0)
> > > >       {
> > > > +      orig_wait_mask = tls->sigwait_mask;
> > > >         tls->sigwait_mask = 0;
> > > > +      tls->unlock ();
> > > >         goto dosig;
> > > >       }
> > > > +  tls->unlock ();
> > > >     if (handler == SIG_IGN)
> > > >       {
> > > > @@ -1606,6 +1611,11 @@ dosig:
> > > >     /* Dispatch to the appropriate function. */
> > > >     sigproc_printf ("signal %d, signal handler %p", si.si_signo, 
> > > > handler);
> > > >     rc = setup_handler (handler, thissig, tls);
> > > > +  if (orig_wait_mask)
> > > > +    {
> > > > +      tls->sigwait_mask = orig_wait_mask;
> > > > +      WakeByAddressAll (&tls->sigwait_mask);
> > > > +    }
> > > >   done:
> > > >     cygheap->unlock_tls (tl_entry);
> > > > 
> > > > Mind, that's just an idea.  There may be a simpler way to do this.
> > > > 
> > > > Alternatively we can just fallback to your version 1.
> > > Using WaitOnAddress() may be nice idea, however, I prefer my v1 patch.
> > > It's simpler and the intent of the code is clearer, isn't it?
> > And somehow an iteration of the above code doesn't actually fix the
> > problem, your original patch does.  So please push.
> 
> Stress-ng upstream recently re-enabled usage of
> pthread_sigqueue+sigtimedwait on Cygwin. If such a build is used with
> cygwin1.dll 26144e40, 'stress-ng --pthread' does no longer report any
> SIGSEGV errors.

Thanks for your feedback!

Corinna

Reply via email to