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. _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel