[libvirt] [PATCH v2 09/38] Introduce virStreamRecvFlags

John Ferlan jferlan at redhat.com
Thu May 4 21:22:45 UTC 2017



On 04/20/2017 06:01 AM, Michal Privoznik wrote:
> Although we already have virStreamRecv, just like some other
> older APIs it is missing @flags argument. This means, the
> function is not that flexible and therefore we need
> virStreamRecvFlags. The latter is going to be needed when we will
> want it to stop at a hole in stream.

Could just simply state this patch is adding the virStreamRecvFlags as a
variant to the virStreamRecv function in order to allow for future
expansion of functionality for processing sparse streams using a @flags
argument.

> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  include/libvirt/libvirt-stream.h |  5 ++++
>  src/driver-stream.h              |  7 +++++
>  src/libvirt-stream.c             | 60 ++++++++++++++++++++++++++++++++++++++++
>  src/libvirt_public.syms          |  5 ++++
>  4 files changed, 77 insertions(+)
> 

[...]

> diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c
> index 8384b37..80b2d47 100644
> --- a/src/libvirt-stream.c
> +++ b/src/libvirt-stream.c
> @@ -286,6 +286,66 @@ virStreamRecv(virStreamPtr stream,
>  
>  
>  /**
> + * virStreamRecvFlags:
> + * @stream: pointer to the stream object
> + * @data: buffer to read into from stream
> + * @nbytes: size of @data buffer
> + * @flags: extra flags; not used yet, so callers should always pass 0
> + *
> + * Reads a series of bytes from the stream. This method may
> + * block the calling application for an arbitrary amount
> + * of time.
> + *
> + * This is just like virStreamRecv except this one has extra
> + * @flags. In fact, calling virStreamRecvFlags(stream, data,
> + * nbytes, 0) is equivalent to calling virStreamRecv(stream,
> + * data, nbytes) and vice versa.

Instead, consider:

Calling this function with no @flags set (equal to zero) is equivalent
to calling virStreamRecv(stream, data, nbytes).

> + *
> + * Returns 0 when the end of the stream is reached, at
> + * which time the caller should invoke virStreamFinish()
> + * to get confirmation of stream completion.
> + *
> + * Returns -1 upon error, at which time the stream will
> + * be marked as aborted, and the caller should now release
> + * the stream with virStreamFree.
> + *
> + * Returns -2 if there is no data pending to be read & the
> + * stream is marked as non-blocking.
> + */
> +int
> +virStreamRecvFlags(virStreamPtr stream,
> +                   char *data,
> +                   size_t nbytes,
> +                   unsigned int flags)
> +{
> +    VIR_DEBUG("stream=%p, data=%p, nbytes=%zi flags=%x",
> +              stream, data, nbytes, flags);

Should 'zi' be 'zu'?  I realize this is cut-n-paste, so perhaps other
usages could be fixed in a trivial patch as well.

> +
> +    virResetLastError();
> +
> +    virCheckStreamReturn(stream, -1);
> +    virCheckNonNullArgGoto(data, error);
> +
> +    if (stream->driver &&
> +        stream->driver->streamRecvFlags) {
> +        int ret;
> +        ret = (stream->driver->streamRecvFlags)(stream, data, nbytes, flags);
> +        if (ret == -2)
> +            return -2;
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virReportUnsupportedError();
> +
> + error:
> +    virDispatchError(stream->conn);
> +    return -1;
> +}
> +
> +
> +/**
>   * virStreamSendAll:
>   * @stream: pointer to the stream object
>   * @handler: source callback for reading data from application
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index 428cf2e..af863bb 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -759,4 +759,9 @@ LIBVIRT_3.1.0 {
>          virDomainSetVcpu;
>  } LIBVIRT_3.0.0;
>  
> +LIBVIRT_3.3.0 {


This will be (at least) 3.4.0...

ACK w/ a couple of adjustments.  Feels strange to not see
remote_protocol.x changed at the same time though...

John
> +    global:
> +        virStreamRecvFlags;
> +} LIBVIRT_3.1.0;
> +
>  # .... define new API here using predicted next version number ....
> 




More information about the libvir-list mailing list