qemu/scripts/qapi
Daniel P. Berrangé 221db5daf6 qapi: enable use of g_autoptr with QAPI types
Currently QAPI generates a type and function for free'ing it:

  typedef struct QCryptoBlockCreateOptions QCryptoBlockCreateOptions;
  void qapi_free_QCryptoBlockCreateOptions(QCryptoBlockCreateOptions *obj);

This is used in the traditional manner:

  QCryptoBlockCreateOptions *opts = NULL;

  opts = g_new0(QCryptoBlockCreateOptions, 1);

  ....do stuff with opts...

  qapi_free_QCryptoBlockCreateOptions(opts);

Since bumping the min glib to 2.48, QEMU has incrementally adopted the
use of g_auto/g_autoptr. This allows the compiler to run a function to
free a variable when it goes out of scope, the benefit being the
compiler can guarantee it is freed in all possible code ptahs.

This benefit is applicable to QAPI types too, and given the seriously
long method names for some qapi_free_XXXX() functions, is much less
typing. This change thus makes the code generator emit:

 G_DEFINE_AUTOPTR_CLEANUP_FUNC(QCryptoBlockCreateOptions,
                              qapi_free_QCryptoBlockCreateOptions)

The above code example now becomes

  g_autoptr(QCryptoBlockCreateOptions) opts = NULL;

  opts = g_new0(QCryptoBlockCreateOptions, 1);

  ....do stuff with opts...

Note, if the local pointer needs to live beyond the scope holding the
variable, then g_steal_pointer can be used. This is useful to return the
pointer to the caller in the success codepath, while letting it be freed
in all error codepaths.

  return g_steal_pointer(&opts);

The crypto/block.h header needs updating to avoid symbol clash now that
the g_autoptr support is a standard QAPI feature.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20200723153845.2934357-1-berrange@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2020-09-03 09:38:36 +02:00
..
__init__.py qapi-gen: New common driver for code and doc generators 2018-03-02 13:14:09 -06:00
commands.py qapi: Smooth visitor error checking in generated code 2020-07-10 15:18:08 +02:00
common.py qapi: Drop conditionals for Python 2 2020-03-05 09:24:11 +01:00
doc.py qapi: Consistently put @features parameter right after @ifcond 2020-03-17 19:58:34 +01:00
error.py qapi: Use super() now we have Python 3 2020-03-05 09:24:11 +01:00
events.py qapi: Add feature flags to remaining definitions 2020-03-17 19:58:34 +01:00
expr.py qapi: Add feature flags to struct members 2020-03-17 21:25:47 +01:00
gen.py qemu-storage-daemon: Add --monitor option 2020-03-06 17:21:28 +01:00
introspect.py qapi: Add feature flags to struct members 2020-03-17 21:25:47 +01:00
parser.py qapi: Brush off some (py)lint 2020-03-05 09:24:11 +01:00
schema.py qapi: New special feature flag "deprecated" 2020-03-17 21:42:47 +01:00
source.py qapi: Inheriting from object is pointless with Python 3, drop 2020-03-05 09:24:11 +01:00
types.py qapi: enable use of g_autoptr with QAPI types 2020-09-03 09:38:36 +02:00
visit.py qapi: Fix visit_type_STRUCT() not to fail for null object 2020-07-21 14:38:23 +02:00