Skip to content
Snippets Groups Projects
  1. May 29, 2016
    • Paolo Bonzini's avatar
      docs/atomics: update comparison with Linux · a4a0e4b2
      Paolo Bonzini authored
      
      Over time, some differences between QEMU and Linux atomics are getting
      smoothed.  In particular, Linux grew atomic_fetch_or (and in general
      the differences regarding RMW operations were not described accurately)
      and smp_load_acquire/smp_store_release.  Also, set_mb was renamed to
      smp_store_mb().  Include these changes in the documentation.
      
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      a4a0e4b2
    • Emilio G. Cota's avatar
      docs/atomics: update atomic_read/set comparison with Linux · 56ebe022
      Emilio G. Cota authored
      Recently Linux did a mass conversion of its atomic_read/set calls
      so that they at least are READ/WRITE_ONCE. See Linux's commit
      62e8a325 ("atomic, arch: Audit atomic_{read,set}()"). It seems though
      that their documentation hasn't been updated to reflect this.
      
      The appended updates our documentation to reflect the change, which
      means there is effectively no difference between our atomic_read/set
      and the current Linux implementation.
      
      While at it, fix the statement that a barrier is implied by
      atomic_read/set, which is incorrect. Volatile/atomic semantics prevent
      transformations pertaining the variable they apply to; this, however,
      has no effect on surrounding statements like barriers do. For more
      details on this, see:
        https://gcc.gnu.org/onlinedocs/gcc/Volatiles.html
      
      
      
      Signed-off-by: default avatarEmilio G. Cota <cota@braap.org>
      Message-Id: <1464120374-8950-2-git-send-email-cota@braap.org>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      56ebe022
  2. May 26, 2016
  3. May 23, 2016
  4. May 18, 2016
  5. May 12, 2016
    • Eric Blake's avatar
      qapi: Change visit_type_FOO() to no longer return partial objects · 68ab47e4
      Eric Blake authored
      
      Returning a partial object on error is an invitation for a careless
      caller to leak memory.  We already fixed things in an earlier
      patch to guarantee NULL if visit_start fails ("qapi: Guarantee
      NULL obj on input visitor callback error"), but that does not
      help the case where visit_start succeeds but some other failure
      happens before visit_end, such that we leak a partially constructed
      object outside visit_type_FOO(). As no one outside the testsuite
      was actually relying on these semantics, it is cleaner to just
      document and guarantee that ALL pointer-based visit_type_FOO()
      functions always leave a safe value in *obj during an input visitor
      (either the new object on success, or NULL if an error is
      encountered), so callers can now unconditionally use
      qapi_free_FOO() to clean up regardless of whether an error occurred.
      
      The decision is done by adding visit_is_input(), then updating the
      generated code to check if additional cleanup is needed based on
      the type of visitor in use.
      
      Note that we still leave *obj unchanged after a scalar-based
      visit_type_FOO(); I did not feel like auditing all uses of
      visit_type_Enum() to see if the callers would tolerate a specific
      sentinel value (not to mention having to decide whether it would
      be better to use 0 or ENUM__MAX as that sentinel).
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <1461879932-9020-25-git-send-email-eblake@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      68ab47e4
    • Eric Blake's avatar
      qapi: Simplify semantics of visit_next_list() · d9f62dde
      Eric Blake authored
      
      The semantics of the list visit are somewhat baroque, with the
      following pseudocode when FooList is used:
      
      start()
      for (prev = head; cur = next(prev); prev = &cur) {
          visit(&cur->value)
      }
      
      Note that these semantics (advance before visit) requires that
      the first call to next() return the list head, while all other
      calls return the next element of the list; that is, every visitor
      implementation is required to track extra state to decide whether
      to return the input as-is, or to advance.  It also requires an
      argument of 'GenericList **' to next(), solely because the first
      iteration might need to modify the caller's GenericList head, so
      that all other calls have to do a layer of dereferencing.
      
      Thankfully, we only have two uses of list visits in the entire
      code base: one in spapr_drc (which completely avoids
      visit_next_list(), feeding in integers from a different source
      than uint8List), and one in qapi-visit.py.  That is, all other
      list visitors are generated in qapi-visit.c, and share the same
      paradigm based on a qapi FooList type, so we can refactor how
      lists are laid out with minimal churn among clients.
      
      We can greatly simplify things by hoisting the special case
      into the start() routine, and flipping the order in the loop
      to visit before advance:
      
      start(head)
      for (tail = *head; tail; tail = next(tail)) {
          visit(&tail->value)
      }
      
      With the simpler semantics, visitors have less state to track,
      the argument to next() is reduced to 'GenericList *', and it
      also becomes obvious whether an input visitor is allocating a
      FooList during visit_start_list() (rather than the old way of
      not knowing if an allocation happened until the first
      visit_next_list()).  As a minor drawback, we now allocate in
      two functions instead of one, and have to pass the size to
      both functions (unless we were to tweak the input visitors to
      cache the size to start_list for reuse during next_list, but
      that defeats the goal of less visitor state).
      
      The signature of visit_start_list() is chosen to match
      visit_start_struct(), with the new parameters after 'name'.
      
      The spapr_drc case is a virtual visit, done by passing NULL for
      list, similarly to how NULL is passed to visit_start_struct()
      when a qapi type is not used in those visits.  It was easy to
      provide these semantics for qmp-output and dealloc visitors,
      and a bit harder for qmp-input (several prerequisite patches
      refactored things to make this patch straightforward).  But it
      turned out that the string and opts visitors munge enough other
      state during visit_next_list() to make it easier to just
      document and require a GenericList visit for now; an assertion
      will remind us to adjust things if we need the semantics in the
      future.
      
      Several pre-requisite cleanup patches made the reshuffling of
      the various visitors easier; particularly the qmp input visitor.
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <1461879932-9020-24-git-send-email-eblake@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      d9f62dde
    • Eric Blake's avatar
      qapi: Split visit_end_struct() into pieces · 15c2f669
      Eric Blake authored
      
      As mentioned in previous patches, we want to call visit_end_struct()
      functions unconditionally, so that visitors can release resources
      tied up since the matching visit_start_struct() without also having
      to worry about error priority if more than one error occurs.
      
      Even though error_propagate() can be safely used to ignore a second
      error during cleanup caused by a first error, it is simpler if the
      cleanup cannot set an error.  So, split out the error checking
      portion (basically, input visitors checking for unvisited keys) into
      a new function visit_check_struct(), which can be safely skipped if
      any earlier errors are encountered, and leave the cleanup portion
      (which never fails, but must be called unconditionally if
      visit_start_struct() succeeded) in visit_end_struct().
      
      Generated code in qapi-visit.c has diffs resembling:
      
      |@@ -59,10 +59,12 @@ void visit_type_ACPIOSTInfo(Visitor *v,
      |         goto out_obj;
      |     }
      |     visit_type_ACPIOSTInfo_members(v, obj, &err);
      |-    error_propagate(errp, err);
      |-    err = NULL;
      |+    if (err) {
      |+        goto out_obj;
      |+    }
      |+    visit_check_struct(v, &err);
      | out_obj:
      |-    visit_end_struct(v, &err);
      |+    visit_end_struct(v);
      | out:
      
      and in qapi-event.c:
      
      @@ -47,7 +47,10 @@ void qapi_event_send_acpi_device_ost(ACP
      |         goto out;
      |     }
      |     visit_type_q_obj_ACPI_DEVICE_OST_arg_members(v, &param, &err);
      |-    visit_end_struct(v, err ? NULL : &err);
      |+    if (!err) {
      |+        visit_check_struct(v, &err);
      |+    }
      |+    visit_end_struct(v);
      |     if (err) {
      |         goto out;
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <1461879932-9020-20-git-send-email-eblake@redhat.com>
      [Conflict with a doc fixup resolved]
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      15c2f669
    • Eric Blake's avatar
      qapi-commands: Wrap argument visit in visit_start_struct · ed841535
      Eric Blake authored
      
      The qmp-input visitor was allowing callers to play rather fast
      and loose: when visiting a QDict, you could grab members of the
      root dictionary without first pushing into the dict; among the
      culprit callers was the generated marshal code on the 'arguments'
      dictionary of a QMP command.  But we are about to tighten the
      input visitor, at which point the generated marshal code MUST
      follow the same paradigms as everyone else, of pushing into the
      struct before grabbing its keys.
      
      Generated code grows as follows:
      
      |@@ -515,7 +641,12 @@ void qmp_marshal_blockdev_backup(QDict *
      |     BlockdevBackup arg = {0};
      |
      |     v = qmp_input_get_visitor(qiv);
      |+    visit_start_struct(v, NULL, NULL, 0, &err);
      |+    if (err) {
      |+        goto out;
      |+    }
      |     visit_type_BlockdevBackup_members(v, &arg, &err);
      |+    visit_end_struct(v, err ? NULL : &err);
      |     if (err) {
      |         goto out;
      |     }
      |@@ -527,7 +715,9 @@ out:
      |     qmp_input_visitor_cleanup(qiv);
      |     qdv = qapi_dealloc_visitor_new();
      |     v = qapi_dealloc_get_visitor(qdv);
      |+    visit_start_struct(v, NULL, NULL, 0, NULL);
      |     visit_type_BlockdevBackup_members(v, &arg, NULL);
      |+    visit_end_struct(v, NULL);
      |     qapi_dealloc_visitor_cleanup(qdv);
      | }
      
      The use of 'err ? NULL : &err' is temporary; a later patch will
      clean that up when it splits visit_end_struct().
      
      Prior to this patch, the fact that there was no final
      visit_end_struct() meant that even though we are using a strict
      input visit, the marshalling code was not detecting excess input
      at the top level (only in nested levels).  Fortunately, we have
      code in monitor.c:qmp_check_client_args() that also checks for
      no excess arguments at the top level.  But as the generated code
      is more compact than the manual check, a later patch will clean
      up monitor.c to drop the redundancy added here.
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <1461879932-9020-9-git-send-email-eblake@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      ed841535
    • Eric Blake's avatar
      qapi: Consolidate QMP input visitor creation · fc471c18
      Eric Blake authored
      
      Rather than having two separate ways to create a QMP input
      visitor, where the safer approach has the more verbose name,
      it is better to consolidate things into a single function
      where the caller must explicitly choose whether to be strict
      or to ignore excess input.  This patch is the strictly
      mechanical conversion; the next patch will then audit which
      uses can be made stricter.
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <1461879932-9020-6-git-send-email-eblake@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      fc471c18
  6. Apr 19, 2016
    • Markus Armbruster's avatar
      fw_cfg: Adopt /opt/RFQDN convention · 63d3145a
      Markus Armbruster authored
      
      FW CFG's primary user is QEMU, which uses it to expose configuration
      information (in the widest sense) to Firmware.  Thus the name FW CFG.
      
      FW CFG can also be used by others for their own purposes.  QEMU is
      merely acting as transport then.  Names starting with opt/ are
      reserved for such uses.  There is no provision, however, to guide safe
      sharing among different such users.
      
      Fix that, loosely following QMP precedence: names should start with
      opt/RFQDN/, where RFQDN is a reverse fully qualified domain name you
      control.
      
      Based on a more ambitious patch from Michael Tsirkin.
      
      Cc: Gerd Hoffmann <kraxel@redhat.com>
      Cc: Gabriel L. Somlo <somlo@cmu.edu>
      Cc: Laszlo Ersek <lersek@redhat.com>
      Cc: Michael S. Tsirkin <mst@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
      Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
      Acked-by: default avatarGabriel Somlo <somlo@cmu.edu>
      Reviewed-by: default avatarLaszlo Ersek <lersek@redhat.com>
      63d3145a
  7. Apr 13, 2016
  8. Apr 07, 2016
  9. Apr 05, 2016
  10. Mar 31, 2016
  11. Mar 30, 2016
    • Pavel Dovgaluk's avatar
      replay: introduce block devices record/replay · 63785678
      Pavel Dovgaluk authored
      
      This patch introduces block driver that implement recording
      and replaying of block devices' operations.
      All block completion operations are added to the queue.
      Queue is flushed at checkpoints and information about processed requests
      is recorded to the log. In replay phase the queue is matched with
      events read from the log. Therefore block devices requests are processed
      deterministically.
      
      Signed-off-by: default avatarPavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
      [ kwolf: Rebased onto modified and already applied part of the series ]
      Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
      63785678
  12. Mar 21, 2016
    • Markus Armbruster's avatar
      ivshmem: Require master to have ID zero · 62a830b6
      Markus Armbruster authored
      
      Migration with ivshmem needs to be carefully orchestrated to work.
      Exactly one peer (the "master") migrates to the destination, all other
      peers need to unplug (and disconnect), migrate, plug back (and
      reconnect).  This is sort of documented in qemu-doc.
      
      If peers connect on the destination before migration completes, the
      shared memory can get messed up.  This isn't documented anywhere.  Fix
      that in qemu-doc.
      
      To avoid messing up register IVPosition on migration, the server must
      assign the same ID on source and destination.  ivshmem-spec.txt leaves
      ID assignment unspecified, however.
      
      Amend ivshmem-spec.txt to require the first client to receive ID zero.
      The example ivshmem-server complies: it always assigns the first
      unused ID.
      
      For a bit of additional safety, enforce ID zero for the master.  This
      does nothing when we're not using a server, because the ID is zero for
      all peers then.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
      Message-Id: <1458066895-20632-40-git-send-email-armbru@redhat.com>
      62a830b6
    • Markus Armbruster's avatar
      ivshmem: Split ivshmem-plain, ivshmem-doorbell off ivshmem · 5400c02b
      Markus Armbruster authored
      
      ivshmem can be configured with and without interrupt capability
      (a.k.a. "doorbell").  The two configurations have largely disjoint
      options, which makes for a confusing (and badly checked) user
      interface.  Moreover, the device can't tell the guest whether its
      doorbell is enabled.
      
      Create two new device models ivshmem-plain and ivshmem-doorbell, and
      deprecate the old one.
      
      Changes from ivshmem:
      
      * PCI revision is 1 instead of 0.  The new revision is fully backwards
        compatible for guests.  Guests may elect to require at least
        revision 1 to make sure they're not exposed to the funny "no shared
        memory, yet" state.
      
      * Property "role" replaced by "master".  role=master becomes
        master=on, role=peer becomes master=off.  Default is off instead of
        auto.
      
      * Property "use64" is gone.  The new devices always have 64 bit BARs.
      
      Changes from ivshmem to ivshmem-plain:
      
      * The Interrupt Pin register in PCI config space is zero (does not use
        an interrupt pin) instead of one (uses INTA).
      
      * Property "x-memdev" is renamed to "memdev".
      
      * Properties "shm" and "size" are gone.  Use property "memdev"
        instead.
      
      * Property "msi" is gone.  The new device can't have MSI-X capability.
        It can't interrupt anyway.
      
      * Properties "ioeventfd" and "vectors" are gone.  They're meaningless
        without interrupts anyway.
      
      Changes from ivshmem to ivshmem-doorbell:
      
      * Property "msi" is gone.  The new device always has MSI-X capability.
      
      * Property "ioeventfd" defaults to on instead of off.
      
      * Property "size" is gone.  The new device can only map all the shared
        memory received from the server.
      
      Guests can easily find out whether the device is configured for
      interrupts by checking for MSI-X capability.
      
      Note: some code added in sub-optimal places to make the diff easier to
      review.  The next commit will move it to more sensible places.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
      Message-Id: <1458066895-20632-37-git-send-email-armbru@redhat.com>
      5400c02b
    • Markus Armbruster's avatar
      ivshmem: Propagate errors through ivshmem_recv_setup() · 1309cf44
      Markus Armbruster authored
      
      This kills off the funny state described in the previous commit.
      
      Simplify ivshmem_io_read() accordingly, and update documentation.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Message-Id: <1458066895-20632-27-git-send-email-armbru@redhat.com>
      Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
      1309cf44
    • Markus Armbruster's avatar
      ivshmem: Don't destroy the chardev on version mismatch · 71c26581
      Markus Armbruster authored
      
      Yes, the chardev is commonly useless after we read a bad version from
      it, but destroying it is inappropriate anyway: the user created it, so
      the user should be able to hold on to it as long as he likes.  We
      don't destroy it on other errors.  Screwed up in commit 5105b1d8.
      
      Stop reading instead.
      
      Also note QEMU's behavior in ivshmem-spec.txt.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
      Message-Id: <1458066895-20632-16-git-send-email-armbru@redhat.com>
      71c26581
    • Markus Armbruster's avatar
      ivshmem: Rewrite specification document · fdee2025
      Markus Armbruster authored
      
      This started as an attempt to update ivshmem_device_spec.txt for
      clarity, accuracy and completeness while working on its code, and
      quickly became a full rewrite.  Since the diff would be useless
      anyway, I'm using the opportunity to rename the file to
      ivshmem-spec.txt.
      
      I tried hard to ensure the new text contradicts neither the old text
      nor the code.  If the new text contradicts the old text but not the
      code, it's probably a bug in the old text.  If the new text
      contradicts both, its probably a bug in the new text.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
      Message-Id: <1458066895-20632-11-git-send-email-armbru@redhat.com>
      fdee2025
  13. Mar 18, 2016
    • Eric Blake's avatar
      qapi: Allow anonymous base for flat union · ac4338f8
      Eric Blake authored
      
      Rather than requiring all flat unions to explicitly create
      a separate base struct, we can allow the qapi schema to specify
      the common members via an inline dictionary. This is similar to
      how commands can specify an inline anonymous type for its 'data'.
      We already have several struct types that only exist to serve as
      a single flat union's base; the next commit will clean them up.
      In particular, this patch's change to the BlockdevOptions example
      in qapi-code-gen.txt will actually be done in the real QAPI schema.
      
      Now that anonymous bases are legal, we need to rework the
      flat-union-bad-base negative test (as previously written, it
      forms what is now valid QAPI; tweak it to now provide coverage
      of a new error message path), and add a positive test in
      qapi-schema-test to use an anonymous base (making the integer
      argument optional, for even more coverage).
      
      Note that this patch only allows anonymous bases for flat unions;
      simple unions are already enough syntactic sugar that we do not
      want to burden them further.  Meanwhile, while it would be easy
      to also allow an anonymous base for structs, that would be quite
      redundant, as the members can be put right into the struct
      instead.
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <1458254921-17042-15-git-send-email-eblake@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      ac4338f8
    • Eric Blake's avatar
      qapi: Make BlockdevOptions doc example closer to reality · bd59adce
      Eric Blake authored
      
      Although we don't want to repeat the entire BlockdevOptions
      QMP command in the example, it helps if we aren't needlessly
      diverging (the initial example was written before we had
      committed the actual QMP interface).  Use names that match what
      is found in qapi/block-core.json, such as '*read-only' rather
      than 'readonly', or 'BlockdevRef' rather than 'BlockRef'.
      
      For the simple union example, invent BlockdevOptionsSimple so
      that later text is unambiguous which of the two union forms is
      meant (telling the user to refer back to two 'BlockdevOptions'
      wasn't nice, and QMP has only the flat union form).
      
      Also, mention that the discriminator of a flat union is
      non-optional.
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <1458254921-17042-14-git-send-email-eblake@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      bd59adce
    • Eric Blake's avatar
      qapi: Adjust names of implicit types · 7599697c
      Eric Blake authored
      
      The original choice of ':obj-' as the prefix for implicit types
      made it obvious that we weren't going to clash with any user-defined
      names, which cannot contain ':'.  But now we want to create structs
      for implicit types, to get rid of special cases in the generators,
      and our use of ':' in implicit names needs a tweak to produce valid
      C code.
      
      We could transliterate ':' to '_', except that C99 mandates that
      "identifiers that begin with an underscore are always reserved for
      use as identifiers with file scope in both the ordinary and tag name
      spaces".  So it's time to change our naming convention: we can
      instead use the 'q_' prefix that we reserved for ourselves back in
      commit 9fb081e0.  Technically, since we aren't planning on exposing
      the empty type in generated code, we could keep the name ':empty',
      but renaming it to 'q_empty' makes the check for startswith('q_')
      cover all implicit types, whether or not code is generated for them.
      
      As long as we don't declare 'empty' or 'obj' ticklish, it shouldn't
      clash with c_name() prepending 'q_' to the user's ticklish names.
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <1458254921-17042-5-git-send-email-eblake@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      7599697c
  14. Mar 15, 2016
    • Pavel Dovgaluk's avatar
      icount: decouple warp calls · e76d1798
      Pavel Dovgaluk authored
      
      qemu_clock_warp function is called to update virtual clock when CPU
      is sleeping. This function includes replay checkpoint to make execution
      deterministic in icount mode.
      Record/replay module flushes async event queue at checkpoints.
      Some of the events (e.g., block devices operations) include interaction
      with hardware. E.g., APIC polled by block devices sets one of IRQ flags.
      Flag to be set depends on currently executed thread (CPU or iothread).
      Therefore in replay mode we have to process the checkpoints in the same thread
      as they were recorded.
      qemu_clock_warp function (and its checkpoint) may be called from different
      thread. This patch decouples two different execution cases of this function:
      call when CPU is sleeping from iothread and call from cpu thread to update
      virtual clock.
      First task is performed by qemu_start_warp_timer function. It sets warp
      timer event to the moment of nearest pending virtual timer.
      Second function (qemu_account_warp_timer) is called from cpu thread
      before execution of the code. It advances virtual clock by adding the length
      of period while CPU was sleeping.
      
      Signed-off-by: default avatarPavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
      Message-Id: <20160310115609.4812.44986.stgit@PASHA-ISP>
      [Update docs. - Paolo]
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      e76d1798
  15. Mar 14, 2016
  16. Mar 11, 2016
  17. Mar 08, 2016
  18. Mar 07, 2016
  19. Mar 05, 2016
    • Eric Blake's avatar
      qapi: Update docs to match recent generator changes · 9ee86b85
      Eric Blake authored
      
      Several commits have been changing the generator, but not updating
      the docs to match:
      - The implicit tag member is named "type", not "kind".  Screwed up in
      commit 39a18158.
      - Commit 9f08c8ec made list types lazy, and thereby dropped
      UserDefOneList if nothing explicitly uses the list type.
      - Commit 51e72bc1 switched the parameter order with 'name' occurring
      earlier.
      - Commit e65d89bf changed the layout of UserDefOneList.
      - Prefer the term 'member' over 'field'.
      - We now expose visit_type_FOO_members() for objects.
      - etc.
      
      Rework the examples to show slightly more output (we don't want to
      show too much; that's what the testsuite is for), and regenerate the
      output to match all recent changes.  Also, rearrange output to show
      .h files before .c (understanding the interface first often makes
      the implementation easier to follow).
      
      Reported-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Message-Id: <1457021813-10704-5-git-send-email-eblake@redhat.com>
      9ee86b85
  20. Mar 01, 2016
  21. Feb 22, 2016
Loading