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

Re: [Xen-devel] [PATCH 24/29] tools/libxl: Allow suppression of POLLHUP for datacopiers



On Wed, 2014-09-10 at 18:11 +0100, Andrew Cooper wrote:
> If the far end of a pipe has been closed, poll() will set POLLHUP.  When
> reading from a pipe, POLLIN|POLLHUP is a valid state, even when there is still
> data to be read.
> 
> Currently, datacopier will bail because of POLLHUP before discovering that
> there is valid data to be read.
> 
> Add an option to ignore POLLHUP for consumers who would prefer to read to EOF.

> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> CC: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
> CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
> 
> ---
> 
> It might be easier/better to alter the POLLHUP handling, but I am struggling
> to work out what effect that would have on the bootloader pty handling.

I was just about to ask why you weren't doing this. I'll leave the
answer to Ian.

> ---
>  tools/libxl/libxl_aoutils.c  |    2 +-
>  tools/libxl/libxl_internal.h |    1 +
>  2 files changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/libxl/libxl_aoutils.c b/tools/libxl/libxl_aoutils.c
> index 9183716..2b39432 100644
> --- a/tools/libxl/libxl_aoutils.c
> +++ b/tools/libxl/libxl_aoutils.c
> @@ -207,7 +207,7 @@ static void datacopier_readable(libxl__egc *egc, 
> libxl__ev_fd *ev,
>      if (datacopier_pollhup_handled(egc, dc, revents, 0))
>          return;
>  
> -    if (revents & ~POLLIN) {
> +    if (revents & ~(POLLIN | (dc->suppress_pollhup ? POLLHUP : 0))) {
>          LOG(ERROR, "unexpected poll event 0x%x (should be POLLIN)"
>              " on %s during copy of %s", revents, dc->readwhat, dc->copywhat);
>          datacopier_callback(egc, dc, -1, 0);
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 056843a..537b523 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -2431,6 +2431,7 @@ struct libxl__datacopier_state {
>      FILE *log; /* gets a copy of everything */
>      libxl__datacopier_callback *callback;
>      libxl__datacopier_callback *callback_pollhup;
> +    int suppress_pollhup;
>      /* remaining fields are private to datacopier */
>      libxl__ev_fd toread, towrite;
>      ssize_t used;



_______________________________________________
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®.