[libvirt] [PATCH 02/13] conf: Introduce helper to help getting correct def for getter functions
John Ferlan
jferlan at redhat.com
Wed Jun 17 20:53:14 UTC 2015
On 06/15/2015 03:47 PM, Peter Krempa wrote:
> virDomainObjGetOneDef will help to retrieve the correct definition
> pointer from @vm in cases where VIR_DOMAIN_AFFECT_LIVE and
> VIR_DOMAIN_AFFECT_CONFIG are mutually exclusive. The function simply
> returns the correct pointer. This similarly to virDomainObjGetDefs will
> greatly simplify the code.
> ---
> src/conf/domain_conf.c | 36 ++++++++++++++++++++++++++++++++++++
> src/conf/domain_conf.h | 1 +
> src/libvirt_private.syms | 1 +
> 3 files changed, 38 insertions(+)
>
I dunno - I just have this little voice asking is there some corner case
from the prior virDomainLiveConfigHelperMethod thruough possibly
creating 'newDef' in virDomainObjSetDefTransient that this new code will
miss... IOW - is there a condition where CONFIG is wanted, domain is
running, but newDef is NULL.
OTOH - one wonders if the previous code went through the patch into
virDomainObjSetDefTransient
All the callers check for NULL, so that's not an issue - just
considering some strange corner case for a transient domain.
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 3cc182b..35e1cb4 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -2948,6 +2948,42 @@ virDomainObjGetDefs(virDomainObjPtr vm,
> }
>
>
> +/**
> + * virDomainObjGetOneDef:
> + *
> + * @vm: Domain object
> + * @flags: for virDomainModificationImpact
> + *
> + * Helper function to resolve @flags and return the correct domain pointer
> + * object. This function returns one of @vm->def or @vm->persistentDef
> + * according to @flags. This helper should be used only in APIs that guarantee
> + * that @flags contains exactly one of VIR_DOMAIN_AFFECT_LIVE,
s/,/ or/
> + * VIR_DOMAIN_AFFECT_CONFIG.
and to be really redundant ;-) - couldn't resist.
s/./ and not both./
ACK - although "GetOneDef" isn't my favorite, I don't have a better
suggestion either.
John
> + *
> + * Returns the correct definition pointer or NULL on error.
> + */
> +virDomainDefPtr
> +virDomainObjGetOneDef(virDomainObjPtr vm,
> + unsigned int flags)
> +{
> + if (flags & VIR_DOMAIN_AFFECT_LIVE && flags & VIR_DOMAIN_AFFECT_CONFIG) {
> + virReportInvalidArg(ctl, "%s",
> + _("Flags 'VIR_DOMAIN_AFFECT_LIVE' and "
> + "'VIR_DOMAIN_AFFECT_CONFIG' are mutually "
> + "exclusive"));
> + return NULL;
> + }
> +
> + if (virDomainObjUpdateModificationImpact(vm, &flags) < 0)
> + return NULL;
> +
> + if (virDomainObjIsActive(vm) && flags & VIR_DOMAIN_AFFECT_CONFIG)
> + return vm->newDef;
> + else
> + return vm->def;
> +}
> +
> +
> /*
> * The caller must hold a lock on the driver owning 'doms',
> * and must also have locked 'dom', to ensure no one else
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index ba17a8d..db49d46 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2553,6 +2553,7 @@ int virDomainObjGetDefs(virDomainObjPtr vm,
> unsigned int flags,
> virDomainDefPtr *liveDef,
> virDomainDefPtr *persDef);
> +virDomainDefPtr virDomainObjGetOneDef(virDomainObjPtr vm, unsigned int flags);
>
> int
> virDomainLiveConfigHelperMethod(virCapsPtr caps,
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index dc8a52d..858c00f 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -385,6 +385,7 @@ virDomainObjEndAPI;
> virDomainObjFormat;
> virDomainObjGetDefs;
> virDomainObjGetMetadata;
> +virDomainObjGetOneDef;
> virDomainObjGetPersistentDef;
> virDomainObjGetState;
> virDomainObjListAdd;
>
More information about the libvir-list
mailing list