[Spice-devel] [PATCH spice-server] spice-char: Add some documentation to SpiceCharDeviceInterface
Frediano Ziglio
fziglio at redhat.com
Wed Apr 11 11:48:20 UTC 2018
>
> > On 23 Mar 2018, at 17:20, Frediano Ziglio <fziglio at redhat.com> wrote:
> >
> >>
> >> Thank you for that. Looks good after two minor grammatical fixes.
> >>
> >>> On 22 Mar 2018, at 11:12, Frediano Ziglio <fziglio at redhat.com> wrote:
> >>>
> >>> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> >>> ---
> >>> server/spice-char.h | 21 +++++++++++++++++++++
> >>> 1 file changed, 21 insertions(+)
> >>>
> >>> diff --git a/server/spice-char.h b/server/spice-char.h
> >>> index 1a8a031d..4d780eb7 100644
> >>> --- a/server/spice-char.h
> >>> +++ b/server/spice-char.h
> >>> @@ -40,9 +40,30 @@ typedef enum {
> >>> struct SpiceCharDeviceInterface {
> >>> SpiceBaseInterface base;
> >>>
> >>> + /* Set the state of the device.
> >>> + * connected should be 0 or 1.
> >>> + * Setting state to 0 cause the device to be disabled.
> >>
> >> Maybe document uses cases for that function?
> >>
> >> Why does the function return a void? Can’t fail? Can you always change the
> >> state? (Does not look like an open/close to me)
> >>
> >
> > Not sure but I suppose the function cannot fail.
> > Is not a open/close, the open/close is more a guest aspect.
> > I cannot find an easy analogy, we (spice server code) are kind of
> > implementing
> > a device (like a kernel module) and we basically are calling a kernel
> > function
> > to tell that this device is not available.
> > The streaming device for instance uses it to enable/disable the guest
> > device.
> >
> >>> + */
> >>> void (*state)(SpiceCharDeviceInstance *sin, int connected);
> >>> +
> >>> + /* Write some bytes to the character device.
> >>> + * Returns bytes copied from buf or a value < 0 on errors.
> >>> + * Function can return a value < len, even 0.
> >>> + * errno is not determined after calling this function.
> >>> + * Function should be implemented as no-blocking.
> >>> + * A len < 0 cause indeterminate results.
> >>
> >> cause -> causes
> >>
> >
> > updated here and below.
> >
> >> I suspect this is not an atomic operation, so you may have written some
> >> stuff
> >> even if the result is < 0?
> >>
> >
> > By atomic you mean "Function can return a value < len, even 0." or
> > something related
> > to threads?
>
> The former. I was thinking of partial writes followed by an error, making the
> write non-atomic from the point of view of the caller.
>
> In other words, say I write “HelloWorld”, and it fails at the W, I am
> wondering if there is a guarantee that write will return 5, and then that
> the retry will return < 0, or if it’s possible that it returns < 0 right
> away.
>
> Probably the best way to know is to dig in the code ;-)
>
I don't think we should document the actual implementation but more the contract,
is supposed to be an interface.
I think both returning a 0 <= value < len or < 0 should be fine in case of partial
read/write.
> > Or maybe a comment that say that if you get an error after handling some
> > bytes the
> > function should return that amount of bytes not returning an error?
> > No idea what we expect in this case, the only reason I can see this would
> > happen is when the guest closes the device but I'm not sure what happens
> > with current Qemu code and what we should expect. I personally would expect
> > that we could receive last bytes sent by the guest.
>
> >
> >>
> >>> + */
> >>> int (*write)(SpiceCharDeviceInstance *sin, const uint8_t *buf, int
> >>> len);
> >>> +
> >>> + /* Read some bytes from the character device.
> >>> + * Returns bytes copied into buf or a value < 0 on errors.
> >>> + * Function can return 0 if no data is available or len is 0.
> >>> + * errno is not determined after calling this function.
> >>> + * Function should be implemented as no-blocking.
> >>> + * A len < 0 cause indeterminate results.
> >>
> >> cause -> causes
> >>
> >>> + */
> >>> int (*read)(SpiceCharDeviceInstance *sin, uint8_t *buf, int len);
> >>> +
> >>> void (*event)(SpiceCharDeviceInstance *sin, uint8_t event);
> >>> spice_char_device_flags flags;
> >>> };
> >
Frediano
More information about the Spice-devel
mailing list