[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 13/12] libxl: events: Break out libxl__pipe_nonblock, _close
On Tue, 2014-01-21 at 15:11 +0000, Ian Jackson wrote: > Break out the pipe creation and destruction from the poller code > into two new functions libxl__pipe_nonblock and libxl__pipe_close. > > No overall functional difference other than minor differences in exact > log messages. > > Also move libxl__self_pipe_wakeup and libxl__self_pipe_eatall into the > new pipe utilities section in libxl_event.c; this is pure code motion. You also switched pipe() -> libxl_pipe(), which is fine but not mentioned here. > Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> > Cc: Jim Fehlig <jfehlig@xxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > --- > tools/libxl/libxl_event.c | 104 > ++++++++++++++++++++++++++---------------- > tools/libxl/libxl_internal.h | 9 ++++ > 2 files changed, 73 insertions(+), 40 deletions(-) > > diff --git a/tools/libxl/libxl_event.c b/tools/libxl/libxl_event.c > index bdef7ac..35a8f81 100644 > --- a/tools/libxl/libxl_event.c > +++ b/tools/libxl/libxl_event.c > @@ -1271,26 +1271,81 @@ int libxl_event_check(libxl_ctx *ctx, libxl_event > **event_r, > } > > /* > - * Manipulation of pollers > + * Utilities for pipes (specifically, useful for self-pipes) > */ > > -int libxl__poller_init(libxl_ctx *ctx, libxl__poller *p) > +void libxl__pipe_close(int fds[2]) > +{ > + if (fds[0] >= 0) close(fds[0]); > + if (fds[1] >= 0) close(fds[1]); > + fds[0] = fds[1] = -1; > +} > + > +int libxl__pipe_nonblock(libxl_ctx *ctx, int fds[2]) > { > int r, rc; > - p->fd_polls = 0; > - p->fd_rindices = 0; > > - r = pipe(p->wakeup_pipe); > + r = libxl_pipe(ctx, fds); > if (r) { > - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot create poller pipe"); > + fds[0] = fds[1] = -1; > rc = ERROR_FAIL; > goto out; > } > > - rc = libxl_fd_set_nonblock(ctx, p->wakeup_pipe[0], 1); > + rc = libxl_fd_set_nonblock(ctx, fds[0], 1); > if (rc) goto out; > > - rc = libxl_fd_set_nonblock(ctx, p->wakeup_pipe[1], 1); > + rc = libxl_fd_set_nonblock(ctx, fds[1], 1); > + if (rc) goto out; > + > + return 0; > + > + out: > + libxl__pipe_close(fds); > + return rc; > +} > + > +int libxl__self_pipe_wakeup(int fd) > +{ > + static const char buf[1] = ""; > + > + for (;;) { > + int r = write(fd, buf, 1); > + if (r==1) return 0; > + assert(r==-1); > + if (errno == EINTR) continue; > + if (errno == EWOULDBLOCK) return 0; > + assert(errno); > + return errno; > + } > +} > + > +int libxl__self_pipe_eatall(int fd) > +{ > + char buf[256]; > + for (;;) { > + int r = read(fd, buf, sizeof(buf)); > + if (r == sizeof(buf)) continue; > + if (r >= 0) return 0; > + assert(r == -1); > + if (errno == EINTR) continue; > + if (errno == EWOULDBLOCK) return 0; > + assert(errno); > + return errno; > + } > +} > + > +/* > + * Manipulation of pollers > + */ > + > +int libxl__poller_init(libxl_ctx *ctx, libxl__poller *p) > +{ > + int rc; > + p->fd_polls = 0; > + p->fd_rindices = 0; > + > + rc = libxl__pipe_nonblock(ctx, p->wakeup_pipe); > if (rc) goto out; > > return 0; > @@ -1302,8 +1357,7 @@ int libxl__poller_init(libxl_ctx *ctx, libxl__poller *p) > > void libxl__poller_dispose(libxl__poller *p) > { > - if (p->wakeup_pipe[1] > 0) close(p->wakeup_pipe[1]); > - if (p->wakeup_pipe[0] > 0) close(p->wakeup_pipe[0]); > + libxl__pipe_close(p->wakeup_pipe); > free(p->fd_polls); > free(p->fd_rindices); > } > @@ -1347,36 +1401,6 @@ void libxl__poller_wakeup(libxl__egc *egc, > libxl__poller *p) > if (e) LIBXL__EVENT_DISASTER(egc, "cannot poke watch pipe", e, 0); > } > > -int libxl__self_pipe_wakeup(int fd) > -{ > - static const char buf[1] = ""; > - > - for (;;) { > - int r = write(fd, buf, 1); > - if (r==1) return 0; > - assert(r==-1); > - if (errno == EINTR) continue; > - if (errno == EWOULDBLOCK) return 0; > - assert(errno); > - return errno; > - } > -} > - > -int libxl__self_pipe_eatall(int fd) > -{ > - char buf[256]; > - for (;;) { > - int r = read(fd, buf, sizeof(buf)); > - if (r == sizeof(buf)) continue; > - if (r >= 0) return 0; > - assert(r == -1); > - if (errno == EINTR) continue; > - if (errno == EWOULDBLOCK) return 0; > - assert(errno); > - return errno; > - } > -} > - > /* > * Main event loop iteration > */ > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > index 8429448..9d17586 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -509,6 +509,15 @@ _hidden char *libxl__strndup(libxl__gc *gc_opt, const > char *c, size_t n) NN1; > * string. (similar to a gc'd dirname(3)). */ > _hidden char *libxl__dirname(libxl__gc *gc_opt, const char *s) NN1; > > +/* Make a pipe and set both ends nonblocking. On error, nothing > + * is left open and both fds[]==-1, and a message is logged. > + * Useful for self-pipes. */ > +_hidden int libxl__pipe_nonblock(libxl_ctx *ctx, int fds[2]); > +/* Closes the pipe fd(s). Either or both of fds[] may be -1 meaning > + * `not open'. Ignores any errors. Sets fds[] to -1. */ > +_hidden void libxl__pipe_close(int fds[2]); > + > + > /* Each of these logs errors and returns a libxl error code. > * They do not mind if path is already removed. > * For _file, path must not be a directory; for _directory it must be. */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |