qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v4 3/4] qobject: replace qobject_incref/QINCREF


From: Marc-André Lureau
Subject: Re: [Qemu-devel] [PATCH v4 3/4] qobject: replace qobject_incref/QINCREF qobject_decref/QDECREF
Date: Tue, 17 Apr 2018 14:18:24 +0200

Hi

On Mon, Apr 16, 2018 at 10:57 AM, Markus Armbruster <address@hidden> wrote:
> Marc-André Lureau <address@hidden> writes:
>
>> Now that we can safely call QOBJECT() on QObject * and children types,
>> we can have a single macro to ref/unref the object.
>>
>> Change the incref/decref prefix name for the more common ref/unref.
>>
>> Note that before the patch, "QDECREF(obj)" was problematic because it
>> would expand to "obj ? obj : ...", which could evaluate "obj" multiple
>> times.
>
> Problematic just in theory, or have you seen problematic uses?

I found it by writing some small new test code, that I don't think are
worth adding.

> Perhaps what you want to say is that spelling your new macros lower case
> is okay, because they evaluate their argument just like a function.
>
> Suggest
>
>   Now that we can safely call QOBJECT() on QObject * as well as its
>   subtypes, we can have macros qobject_ref() / qobject_unref() that work
>   everywhere instead of having to use QINCREF() / QDECREF() for QObject
>   and qobject_incref() / qobject_decref() for its subtypes.
>
>   Note that the new macros evalcuate their argument exactly once, thus
>   no need to shout them.

ok

>
>>
>> Signed-off-by: Marc-André Lureau <address@hidden>
>> ---
>>  scripts/qapi/events.py              |   2 +-
>>  include/qapi/qmp/qnull.h            |   2 +-
>>  include/qapi/qmp/qobject.h          |  36 +++++-----
>>  block.c                             |  78 +++++++++++-----------
>>  block/blkdebug.c                    |   4 +-
>>  block/blkverify.c                   |   4 +-
>>  block/crypto.c                      |   4 +-
>>  block/gluster.c                     |   4 +-
>>  block/iscsi.c                       |   2 +-
>>  block/nbd.c                         |   4 +-
>>  block/nfs.c                         |   4 +-
>>  block/null.c                        |   2 +-
>>  block/nvme.c                        |   2 +-
>>  block/parallels.c                   |   4 +-
>>  block/qapi.c                        |   2 +-
>>  block/qcow.c                        |   8 +--
>>  block/qcow2.c                       |   8 +--
>>  block/qed.c                         |   4 +-
>>  block/quorum.c                      |   2 +-
>>  block/rbd.c                         |  14 ++--
>>  block/sheepdog.c                    |  12 ++--
>>  block/snapshot.c                    |   4 +-
>>  block/ssh.c                         |   4 +-
>>  block/vdi.c                         |   2 +-
>>  block/vhdx.c                        |   4 +-
>>  block/vpc.c                         |   4 +-
>>  block/vvfat.c                       |   2 +-
>>  block/vxhs.c                        |   2 +-
>>  blockdev.c                          |  16 ++---
>>  hw/i386/acpi-build.c                |  12 ++--
>>  hw/ppc/spapr_drc.c                  |   2 +-
>>  hw/usb/xen-usb.c                    |   4 +-
>>  migration/migration.c               |   4 +-
>>  migration/qjson.c                   |   2 +-
>>  monitor.c                           |  50 +++++++-------
>>  qapi/qapi-dealloc-visitor.c         |   4 +-
>>  qapi/qmp-dispatch.c                 |   6 +-
>>  qapi/qobject-input-visitor.c        |   8 +--
>>  qapi/qobject-output-visitor.c       |   8 +--
>>  qemu-img.c                          |  18 ++---
>>  qemu-io.c                           |   6 +-
>>  qga/main.c                          |  12 ++--
>>  qmp.c                               |   4 +-
>>  qobject/json-parser.c               |  10 +--
>>  qobject/qdict.c                     |  38 +++++------
>>  qobject/qjson.c                     |   2 +-
>>  qobject/qlist.c                     |   4 +-
>>  qom/object.c                        |  16 ++---
>>  qom/object_interfaces.c             |   2 +-
>>  target/ppc/translate_init.c         |   2 +-
>>  target/s390x/cpu_models.c           |   2 +-
>>  tests/ahci-test.c                   |   6 +-
>>  tests/check-qdict.c                 | 100 ++++++++++++++--------------
>>  tests/check-qjson.c                 |  84 +++++++++++------------
>>  tests/check-qlist.c                 |   8 +--
>>  tests/check-qlit.c                  |  10 +--
>>  tests/check-qnull.c                 |  10 +--
>>  tests/check-qnum.c                  |  28 ++++----
>>  tests/check-qobject.c               |   2 +-
>>  tests/check-qstring.c               |  10 +--
>>  tests/cpu-plug-test.c               |   4 +-
>>  tests/device-introspect-test.c      |  24 +++----
>>  tests/drive_del-test.c              |   4 +-
>>  tests/libqos/libqos.c               |   8 +--
>>  tests/libqos/pci-pc.c               |   2 +-
>>  tests/libqtest.c                    |  24 +++----
>>  tests/machine-none-test.c           |   2 +-
>>  tests/migration-test.c              |  24 +++----
>>  tests/numa-test.c                   |  16 ++---
>>  tests/pvpanic-test.c                |   2 +-
>>  tests/q35-test.c                    |   2 +-
>>  tests/qmp-test.c                    |  38 +++++------
>>  tests/qom-test.c                    |   8 +--
>>  tests/tco-test.c                    |  12 ++--
>>  tests/test-char.c                   |   2 +-
>>  tests/test-keyval.c                 |  82 +++++++++++------------
>>  tests/test-netfilter.c              |  26 ++++----
>>  tests/test-qemu-opts.c              |  14 ++--
>>  tests/test-qga.c                    |  76 ++++++++++-----------
>>  tests/test-qmp-cmds.c               |  24 +++----
>>  tests/test-qmp-event.c              |   2 +-
>>  tests/test-qobject-input-visitor.c  |  10 +--
>>  tests/test-qobject-output-visitor.c |  18 ++---
>>  tests/test-visitor-serialization.c  |   6 +-
>>  tests/test-x86-cpuid-compat.c       |  14 ++--
>>  tests/tmp105-test.c                 |   4 +-
>>  tests/vhost-user-test.c             |   6 +-
>>  tests/virtio-net-test.c             |   6 +-
>>  tests/vmgenid-test.c                |   2 +-
>>  tests/wdt_ib700-test.c              |  14 ++--
>>  util/keyval.c                       |  12 ++--
>>  util/qemu-config.c                  |   4 +-
>>  docs/devel/qapi-code-gen.txt        |   2 +-
>>  scripts/coccinelle/qobject.cocci    |   8 +--
>>  94 files changed, 606 insertions(+), 610 deletions(-)
>
> It's a lot of churn.  I'm willing to accept the one-time pain because
> the result is easier on the eyes.
>
>> diff --git a/scripts/qapi/events.py b/scripts/qapi/events.py
>> index 3dc523cf39..4426861ff1 100644
>> --- a/scripts/qapi/events.py
>> +++ b/scripts/qapi/events.py
>> @@ -142,7 +142,7 @@ out:
>>  ''')
>>      ret += mcgen('''
>>      error_propagate(errp, err);
>> -    QDECREF(qmp);
>> +    qobject_unref(qmp);
>>  }
>>  ''')
>>      return ret
>> diff --git a/include/qapi/qmp/qnull.h b/include/qapi/qmp/qnull.h
>> index e8ea2c315a..75b29c6a39 100644
>> --- a/include/qapi/qmp/qnull.h
>> +++ b/include/qapi/qmp/qnull.h
>> @@ -23,7 +23,7 @@ extern QNull qnull_;
>>
>>  static inline QNull *qnull(void)
>>  {
>> -    QINCREF(&qnull_);
>> +    qobject_ref(&qnull_);
>>      return &qnull_;
>>  }
>>
>> diff --git a/include/qapi/qmp/qobject.h b/include/qapi/qmp/qobject.h
>> index 7e6fed242e..fce4a1cd75 100644
>> --- a/include/qapi/qmp/qobject.h
>> +++ b/include/qapi/qmp/qobject.h
>> @@ -16,16 +16,16 @@
>>   *
>>   *  - Returning references: A function that returns an object may
>>   *  return it as either a weak or a strong reference.  If the reference
>> - *  is strong, you are responsible for calling QDECREF() on the reference
>> + *  is strong, you are responsible for calling qobject_unref() on the 
>> reference
>
> Long line.
>
>>   *  when you are done.
>>   *
>>   *  If the reference is weak, the owner of the reference may free it at
>>   *  any time in the future.  Before storing the reference anywhere, you
>> - *  should call QINCREF() to make the reference strong.
>> + *  should call qobject_ref() to make the reference strong.
>>   *
>>   *  - Transferring ownership: when you transfer ownership of a reference
>>   *  by calling a function, you are no longer responsible for calling
>> - *  QDECREF() when the reference is no longer needed.  In other words,
>> + *  qobject_unref() when the reference is no longer needed.  In other words,
>>   *  when the function returns you must behave as if the reference to the
>>   *  passed object was weak.
>>   */
> [...]
>



-- 
Marc-André Lureau



reply via email to

[Prev in Thread] Current Thread [Next in Thread]