On Wed, Jan 16, 2008 at 04:17:10AM +0100, Marc Lehmann wrote: > On Tue, Jan 15, 2008 at 10:47:33AM -0500, Chris Shoemaker <[EMAIL PROTECTED]> > wrote: > > > handler before creating the process, or before the process exits, only > > > before you poll for more events. > > > > I'm glad we finally agree, in practice at least. > > No, we don't. Your claim was wrong and is wrong. We do not agree the > least. I don't understand why you cannot accept that.
>From my perspective, you're agreeing with me. If you disagree, we'll just have to agree to disagree about whether or not we agree! > > In my opinion, this is a rather special and uninteresting exception to > > the general rule that running the default event loop will eagerly reap > > the exit status of children, even before an ev_child has started. > > Despite your opinion, it is by far the most common and important > case. Your case, on the other hand, is very uncommon, and pessimising that > a bit in favor of providing good and simple support for the common case > makes sense (simple things should be simple, complex ones possible). Ok, I'll take your word for it. > > > libev doesn't make it as if a child died more than once, even if there are > > > multiple ev_child watchers. this isn't possible with the unix semantics. >> >> Eh?! Sometimes I wonder if we're reading the same code. Of course it does! >> Two watchers for the same pid. How many get triggered? > > Both. > >> TWO! It had better be so, because that's exactly what the code does: > > Indeed. > > > It loops over ev_childs, feeding all the events. Remember?: > > I know my code well, thank you very much. Please stop insulting me. > > > why I warned you that my patch changed that.) Understand, I'm not > > criticizing the design, different apps have different goals. Again, I > > really have to stick to POSIX semantics, so a child only dies once. > > The child dies only once, and this is reported properly by libev to all > interested watchers. In no way does libev make it as if a child died more > than once. I'll assume that in your view this is somehow not equivocation. There's no need for you to explain any further. > > > in fact, your algorithm contains a race condition where an ev_child > > > watcher gets the exist status of the wrong process (one that is started > > > between the two waitpid calls), something libev avoids. > > > > I assume you're talking about: > > > > pid = waitpid (w->pid, &status, WNOHANG | WUNTRACED | WCONTINUED); > > /* What if a new process is started right now? */ > > if (WCONTINUED && pid < 0 && errno == EINVAL) { > > pid = waitpid (w->pid, &status, WNOHANG | WUNTRACED); > > } > > > > I don't understand what you mean about the sending the status of the > > wrong process. If the watcher gets an event, I think it's always for > > a "matching" process. (It might match the process group, btw.) > > a) if you have a watcher that waits for pid 5, and one that waits for -1, > only one of them gets the event, when both should. right. > b) if you have a watcher that waits for pid -1 and later start one for pid 5 > but the process was altready reaped, you lost the event. not "lost" really, just delivered to the pid -1 watcher. > c) if you have two watchers that wait for pid 5, then the second one might > not get the exit status at all, or the exit status of the wrong one. actually, one would get the exit status, and one would get ECHILD. > there are other problems and races. I don't see those as problems. That's the behavior I want. -chris _______________________________________________ libev mailing list libev@lists.schmorp.de http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev