[libvirt] [PATCH] build: Embed dbus_message_unref in virdbus

Martin Kletzander mkletzan at redhat.com
Mon Apr 14 12:51:18 UTC 2014


On Mon, Apr 14, 2014 at 01:33:21PM +0100, Daniel P. Berrange wrote:
>On Mon, Apr 14, 2014 at 02:20:11PM +0200, Martin Kletzander wrote:
>> On Mon, Apr 14, 2014 at 01:02:02PM +0100, Daniel P. Berrange wrote:
>> >On Mon, Apr 14, 2014 at 01:41:18PM +0200, Martin Kletzander wrote:
>> >>Adding dbus_message_unref() into virDBusMessageDecodeArgs() makes sure
>> >>that the message gets unref'd, thus making one more pure dbus call not
>> >>necessary.  Even though we are calling a lot of dbus_* functions
>> >>outside virdbus (which should be fixed in the future IMHO), this patch
>> >>fixes only this one instance because it merely aims to fix a
>> >>build-breaker caused by improperly included dbus.h.  The message
>> >>printed when failing (using --without-dbus) is:
>> >
>> >
>> >>diff --git a/src/util/virdbus.c b/src/util/virdbus.c
>> >>index 0cd3858..aef1d34 100644
>> >>--- a/src/util/virdbus.c
>> >>+++ b/src/util/virdbus.c
>> >>@@ -1112,6 +1112,7 @@ int virDBusMessageDecodeArgs(DBusMessage* msg,
>> >>     }
>> >>
>> >>     ret = virDBusMessageIterDecode(&iter, types, args);
>> >>+    dbus_message_unref(msg);
>> >>
>> >>  cleanup:
>> >>     return ret;
>> >
>> >NACK, this is basically reverting the change I did previously and
>> >will break the firewall patches I have pending.
>> >
>>
>> OK, this makes sense if we do one of the following:
>>
>> a) Implement a virDBusMessageUnref() which does the same thing if we
>>    have dbus, which would be no-op otherwise, thus making pure dbus_*
>>    calls completely wrapped such uses or
>>
>> b) encapsulate systemd checks for pm-utils in ifdef
>>    WITH_SYSTEMD_DAEMON like this:
>>
>> diff --git i/src/util/virnodesuspend.c w/src/util/virnodesuspend.c
>> index 59b84ef..20b85b8 100644
>> --- i/src/util/virnodesuspend.c
>> +++ w/src/util/virnodesuspend.c
>> @@ -1,6 +1,7 @@
>> /*
>>  * virnodesuspend.c: Support for suspending a node (host machine)
>>  *
>> + * Copyright (C) 2014 Red Hat, Inc.
>>  * Copyright (C) 2011 Srivatsa S. Bhat <srivatsa.bhat at linux.vnet.ibm.com>
>>  *
>>  * This library is free software; you can redistribute it and/or
>> @@ -269,6 +270,7 @@ virNodeSuspendSupportsTargetPMUtils(unsigned int target, bool *supported)
>> }
>> #endif
>>
>> +#ifdef WITH_SYSTEMD_DAEMON
>> static int
>> virNodeSuspendSupportsTargetSystemd(unsigned int target, bool *supported)
>> {
>> @@ -292,6 +294,7 @@ virNodeSuspendSupportsTargetSystemd(unsigned int target, bool *supported)
>>
>>     return ret;
>> }
>> +#endif /* WITH_SYSTEMD_DAEMON */
>>
>> /**
>>  * virNodeSuspendSupportsTarget:
>> @@ -310,14 +313,23 @@ virNodeSuspendSupportsTargetSystemd(unsigned int target, bool *supported)
>> static int
>> virNodeSuspendSupportsTarget(unsigned int target, bool *supported)
>> {
>> -    int ret;
>> +    int ret = 0;
>> +
>> +#ifdef WITH_SYSTEMD_DAEMON
>> +    if (virNodeSuspendSupportsTargetSystemd(target, supported) == 0)
>> +        goto cleanup;
>> +#endif
>>
>> -    ret = virNodeSuspendSupportsTargetSystemd(target, supported);
>> #ifdef WITH_PM_UTILS
>> -    if (ret < 0)
>> -        ret = virNodeSuspendSupportsTargetPMUtils(target, supported);
>> +    if (virNodeSuspendSupportsTargetPMUtils(target, supported) == 0)
>> +        goto cleanup;
>> #endif

[1]

>>
>> +    ret = -1;
>> +    virReportSystemError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                         _("Unable to get supported suspend types"));
>> +
>> + cleanup:
>>     return ret;
>> }
>>
>> diff --git i/src/util/virsystemd.c w/src/util/virsystemd.c
>> index e9ca564..d953f8a 100644
>> --- i/src/util/virsystemd.c
>> +++ w/src/util/virsystemd.c
>> @@ -1,7 +1,7 @@
>> /*
>>  * virsystemd.c: helpers for using systemd APIs
>>  *
>> - * Copyright (C) 2013 Red Hat, Inc.
>> + * Copyright (C) 2013, 2014 Red Hat, Inc.
>>  *
>>  * This library is free software; you can redistribute it and/or
>>  * modify it under the terms of the GNU Lesser General Public
>> @@ -326,6 +326,7 @@ virSystemdNotifyStartup(void)
>> #endif
>> }
>>
>> +#ifdef WITH_SYSTEMD_DAEMON
>> static int
>> virSystemdPMSupportTarget(const char *methodName, bool *result)
>> {
>> @@ -370,6 +371,17 @@ virSystemdPMSupportTarget(const char *methodName, bool *result)
>>     return ret;
>> }
>>
>> +#else /* ! WITH_SYSTEMD_DAEMON */
>> +
>> +static int
>> +virSystemdPMSupportTarget(const char *methodName ATTRIBUTE_UNUSED,
>> +                          bool *result ATTRIBUTE_UNUSED)
>> +{
>> +    return -1;
>> +}
>> +
>> +#endif /* ! WITH_SYSTEMD_DAEMON */
>
>How about making this method return '0' instead of '-1'. After all,
>if we haven't built systemd,then logging it doesn't support the PM
>mode being queried. That way we don't need conditionals for the
>callers of this method - they'll just do the right thing.
>

But then virNodeSuspendSupportsTarget() [1] will succeed without
querying anything else.  Or have I misunderstood and you meant
changing virNodeSuspendSupportsTarget() so that it queries everything
possible until supported != true?

Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140414/eb142a3e/attachment-0001.sig>


More information about the libvir-list mailing list