[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH 09/27] qdict: Introduce qdict_rename_keys()
From: |
Max Reitz |
Subject: |
Re: [Qemu-block] [PATCH 09/27] qdict: Introduce qdict_rename_keys() |
Date: |
Fri, 9 Feb 2018 19:18:29 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 |
On 2018-02-08 20:23, Kevin Wolf wrote:
> A few block drivers will need to rename .bdrv_create options for their
> QAPIfication, so let's have a helper function for that.
>
> Signed-off-by: Kevin Wolf <address@hidden>
> ---
> include/qapi/qmp/qdict.h | 6 ++++++
> qobject/qdict.c | 30 ++++++++++++++++++++++++++++++
> 2 files changed, 36 insertions(+)
Hmmm, looks OK, but I wonder whether this is going to be any more
efficient than if we simply had a qdict_rename_key() function that you
call multiple times.
("efficient" both in terms of code readability and runtime efficiency)
So, I'll give you a
Reviewed-by: Max Reitz <address@hidden>
and let you decide.
>
> diff --git a/include/qapi/qmp/qdict.h b/include/qapi/qmp/qdict.h
> index fc218e7be6..862441b9d3 100644
> --- a/include/qapi/qmp/qdict.h
> +++ b/include/qapi/qmp/qdict.h
> @@ -90,4 +90,10 @@ QObject *qdict_crumple(const QDict *src, Error **errp);
>
> void qdict_join(QDict *dest, QDict *src, bool overwrite);
>
> +typedef struct QDictRenames {
> + const char *from;
> + const char *to;
> +} QDictRenames;
> +bool qdict_rename_keys(QDict *qdict, const QDictRenames *renames, Error
> **errp);
> +
> #endif /* QDICT_H */
> diff --git a/qobject/qdict.c b/qobject/qdict.c
> index e8f15f1132..07ae9489a7 100644
> --- a/qobject/qdict.c
> +++ b/qobject/qdict.c
> @@ -1051,3 +1051,33 @@ void qdict_join(QDict *dest, QDict *src, bool
> overwrite)
> entry = next;
> }
> }
> +
> +/**
> + * qdict_rename_keys(): Rename keys in qdict according to the replacements
> + * specified in the array renames. The array must be terminated by an entry
> + * with from = NULL.
> + *
> + * Returns true for success, false in error cases.
> + */
> +bool qdict_rename_keys(QDict *qdict, const QDictRenames *renames, Error
> **errp)
> +{
> + QObject *qobj;
> +
> + while (renames->from) {
> + if (qdict_haskey(qdict, renames->from)) {
> + if (qdict_haskey(qdict, renames->to)) {
> + error_setg(errp, "'%s' and its alias '%s' can't be used at
> the "
> + "same time", renames->to, renames->from);
> + return false;
> + }
> +
> + qobj = qdict_get(qdict, renames->from);
> + qobject_incref(qobj);
> + qdict_put_obj(qdict, renames->to, qobj);
> + qdict_del(qdict, renames->from);
> + }
> +
> + renames++;
> + }
> + return true;
> +}
>
signature.asc
Description: OpenPGP digital signature
- [Qemu-block] [PATCH 06/27] qcow2: Use QCryptoBlockCreateOptions in qcow2_create2(), (continued)
- [Qemu-block] [PATCH 06/27] qcow2: Use QCryptoBlockCreateOptions in qcow2_create2(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 07/27] qcow2: Handle full/falloc preallocation in qcow2_create2(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 08/27] util: Add qemu_opts_to_qdict_filtered(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 09/27] qdict: Introduce qdict_rename_keys(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 10/27] qcow2: Use visitor for options in qcow2_create(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 11/27] block: x-blockdev-create QMP command, Kevin Wolf, 2018/02/08