[PATCH 6 of 8 V5] worker: make sure killworkers runs at most once

Jun Wu quark at fb.com
Wed Nov 16 10:18:07 EST 2016


Excerpts from Yuya Nishihara's message of 2016-11-17 00:00:01 +0900:
> On Wed, 16 Nov 2016 13:57:58 +0000, Jun Wu wrote:
> > Excerpts from Yuya Nishihara's message of 2016-11-16 21:25:45 +0900:
> > > I meant set.discard(). My idea is:
> > > 
> > >  a. discard pid by anyone who notices it no longer exists
> > >  b. then, kill the rest
> > 
> > This looks good. Although it's still possible to kill processes multiple
> > times (because atomic "wait-and-drop-pid" is impossible).
> 
> Hmm, signal handlers are stacked at arbitrary code location, there's no
> time-based preemption like threading, I think. So even if the wait-discard(p)
> sequence is interrupted by another waitforworkers(), the process "p" would

Only one "p" will be discard. There could be multiple "p"s that need to be
discarded.

  waitforworkers
    p1: need to be discarded
      SIGCHLD
        waitforworkers
        p2: need to be discarded
      SIGCHLD
        waitforworkers
        p3: need to be discarded
      SIGCHLD
        waitforworkers
        p4: need to be discarded
      ....
    discard p1
    killworkers
      # kill p2, p3, p4 unnecessarily

As long as there is no way to do "atomic waitpid + set.discard", the problem
can not be solved perfectly.

> be discarded before killworkers() thanks to ECHILD. And we do unregister the
> SIGCHLD handler before killworkers().
> 
> I'll queue the series without the patch 6.


More information about the Mercurial-devel mailing list