[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 16/20] libxl: event API: new facilities for waiting for subprocesses



On Tue, 2012-03-20 at 17:24 +0000, Ian Jackson wrote:
> Thanks for the thorough review!
> 
> Ian Campbell writes ("Re: [Xen-devel] [PATCH 16/20] libxl: event API: new 
> facilities for waiting for subprocesses"):
> > On Fri, 2012-03-16 at 16:26 +0000, Ian Jackson wrote:
> > > +    /* May make callbacks into the appliction for child processes.
> > 
> > Typo:                                application
> 
> Fixed.
> 
> > > +int libxl__self_pipe_eatall(int fd)
> > > +{
> > > +    char buf[256];
> > > +    for (;;) {
> > > +        int r = read(fd, buf, sizeof(buf));
> > > +        if (r >= 0) return 0;
> > 
> > Is there some 256 byte limit on the number of bytes pending in the pipe
> > somewhere? Wouldn't r==256 require us to (potentially) go round the loop
> > again?
> 
> If this loop has to go round again, it means we have had 256
> wakeup events of some kind.  I don't think this is really an
> efficiency concern and it makes the code simpler not to have to worry
> about it.

My concern is that we would exit the loop _without_ going round again
because if r == 256 then also r>= 0 and we return i.e. we don't actually
"eatall" the buffer, or does that not matter?

> > > +    /* With libxl_sigchld_owner_libxl, called by libxl when it has
> > > +     * reaped a pid.  (Not permitted with _owner_mainloop.)
> > > +     *
> > > +     * Should return 0 if the child was recognised by the application
> > > +     * (or if the application does not keep those kind of records),
> > > +     * ERROR_NOT_READY if the application knows that the child is not
> > 
> > ERROR_NOT_READY seems like an odd name. ERROR_UNKNOWN_CHILD perhaps?
> 
> I was reusing an existing error code.  Do you think it should have its
> own ?

You once told me we shouldn't be shy about adding error codes for
specific things..

> > > +int libxl__sigchld_installhandler(libxl_ctx *ctx) /* non-reentrant */
> > > +{
> > > +    int r, rc;
> > > +
> > > +    if (ctx->sigchld_selfpipe[0] < 0) {
> > > +        r = pipe(ctx->sigchld_selfpipe);
> > > +        if (r) {
> > > +            ctx->sigchld_selfpipe[0] = -1;
> > > +            LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
> > > +                             "failed to create sigchld pipe");
> > > +            rc = ERROR_FAIL;
> > > +            goto out;
> > > +        }
> > > +    }
> > > +
> > > +    atfork_lock();
> > > +    if (sigchld_owner != ctx) {
> > 
> > A non-NULL sigchld_owner which is != ctx is a pretty serious error here,
> > isn't it?
> 
> Yes.
> 
> > > +        struct sigaction ours;
> > > +
> > > +        assert(!sigchld_owner);
> 
> Hence this assertion.

Right.

> > > +     * ctx must be locked EXACTLY ONCE */
> > > +    EGC_GC;
> > > +
> > > +    while (chldmode_ours(CTX) /* in case the app changes the mode */) {
> > 
> > setmode takes the CTX lock and ctx must be locked here too, so can this
> > happen? Ah, we unlock inside the loop, ok then.
> > 
> > Changing the mode in the callback seems, er, ambitious given you can't
> > call it when libxl has any children and we recommend you do it once at
> > start of day. Can we not just outlaw it?
> 
> The callback might well be what makes the application decide it needs
> to change the mode.  It would need an if() anyway since you might
> respond to the fd readability after the mode has been changed.

OK
Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.