All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: Markus Armbruster <armbru@redhat.com>,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: kwolf@redhat.com, quintela@redhat.com, qemu-devel@nongnu.org,
	laine@redhat.com, lcapitulino@redhat.com
Subject: Re: [Qemu-devel] [PATCH 2/7] runstate: Add runstate store
Date: Wed, 22 Oct 2014 09:52:55 -0600	[thread overview]
Message-ID: <5447D2D7.6030202@redhat.com> (raw)
In-Reply-To: <87vbnccoz1.fsf@blackfin.pond.sub.org>

[-- Attachment #1: Type: text/plain, Size: 2961 bytes --]

On 10/22/2014 05:40 AM, Markus Armbruster wrote:
>> I think the question here really comes from RunState being an enum defined
>> in qapi-schema.json; so we could use that directly in the migration stream
>> if we were guaranteed that the encoding of that enum wasn't going to change.
>> Does qapi make any guarantees about the enum encoding?
> 
> qapi-code-gen.txt in master is silent on the matter:
> 
>     === Enumeration types ===
> 
>     An enumeration type is a dictionary containing a single key whose value is a
>     list of strings.  An example enumeration is:
> 
>      { 'enum': 'MyEnum', 'data': [ 'value1', 'value2', 'value3' ] }
> 
> Eric's "drop qapi nested structs" series improves the spec a lot.

And I still need to find time to supply the next revision of that series...

>     The enumeration values are passed as strings over the QMP protocol,
>     but are encoded as C enum integral values in generated code.  While
>     the C code starts numbering at 0, it is better to use explicit
>     comparisons to enum values than implicit comparisons to 0; the C code
>     will also include a generated enum member ending in _MAX for tracking
>     the size of the enum, useful when using common functions for
>     converting between strings and enum values.  Since the wire format
>     always passes by name, it is acceptable to reorder or add new
>     enumeration members in any location without breaking QMP clients;
>     however, removing enum values would break compatibility.  For any
>     complex type that has a field that will only contain a finite set of
>     string values, using an enum type for that field is better than
>     open-coding the field to be type 'str'.
> 
> I figure relying on the QAPI code generator assigning values 0, 1, 2 in
> order is fair.  If you want to guarantee that more explicitly in the
> spec, patch welcome (on top of Eric's, please).

Yes, the generator guarantees that the order that enums are listed in a
.json file will be the 0, 1, 2, ... values assigned in the C code.  I'll
add that in my revision.  You cannot rely on the C values being stable
unless the .json file takes care to not reorder names for the enum
members; if we have enums where the C code is going to rely on a
particular ordering, we probably ought to document that in the .json
file (since MOST enums are designed for the C code to use them solely by
symbolic name and not by specific value).

> 
> A test or build-time assertion checking the values don't change would be
> prudent.  A comment next to the enum definition warning against
> incompatible changes wouldn't hurt.

Indeed, if you are going to rely on something that the generator happens
to give but does not guarantee, then additional build-time checking and
documentation is called for.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 539 bytes --]

  reply	other threads:[~2014-10-22 15:53 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-15  7:55 [Qemu-devel] [RFC 0/7] Optional toplevel sections Juan Quintela
2014-10-15  7:55 ` [Qemu-devel] [PATCH 1/7] migration: Create optional sections Juan Quintela
2014-10-15  7:55 ` [Qemu-devel] [PATCH 2/7] runstate: Add runstate store Juan Quintela
2014-10-20 10:24   ` Dr. David Alan Gilbert
2014-10-20 10:52     ` Juan Quintela
2014-10-20 15:18       ` Eric Blake
2014-10-22 11:18         ` Dr. David Alan Gilbert
2014-10-22 11:40           ` Markus Armbruster
2014-10-22 15:52             ` Eric Blake [this message]
2014-10-15  7:55 ` [Qemu-devel] [PATCH 3/7] runstate: create runstate_index function Juan Quintela
2014-10-15  7:55 ` [Qemu-devel] [PATCH 4/7] runstate: migration allows more transitions now Juan Quintela
2014-10-15 14:42   ` Eric Blake
2014-10-15 15:50     ` Juan Quintela
2014-11-03 12:46   ` Amit Shah
2014-10-15  7:55 ` [Qemu-devel] [PATCH 5/7] migration: create now section to store global state Juan Quintela
2014-10-20 10:52   ` Dr. David Alan Gilbert
2014-10-20 11:11   ` Kevin Wolf
2014-10-15  7:55 ` [Qemu-devel] [PATCH 6/7] global_state: Make section optional Juan Quintela
2014-10-15  7:55 ` [Qemu-devel] [PATCH 7/7] vmstate: Create optional sections Juan Quintela
2014-10-15 14:45   ` Eric Blake
2014-10-15 14:57 ` [Qemu-devel] [RFC 0/7] Optional toplevel sections Eric Blake
2014-10-15 15:59   ` Juan Quintela
2014-10-15 16:37     ` Eric Blake
2014-10-17 13:41     ` Paolo Bonzini
2014-10-20 14:59       ` Dr. David Alan Gilbert
2014-10-20 11:29 ` Kevin Wolf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5447D2D7.6030202@redhat.com \
    --to=eblake@redhat.com \
    --cc=armbru@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=laine@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.