[libvirt] [dbus PATCH 6/8] introduce support for GDBus implementation
Daniel P. Berrangé
berrange at redhat.com
Mon Mar 19 13:47:20 UTC 2018
On Mon, Mar 19, 2018 at 10:30:50AM +0100, Pavel Hrdina wrote:
> We will switch to GDBus implementation of D-Bus protocol because
> sd-bus implementation is not thread safe.
>
> Processing messages in threads is essential since Libvirt API can
> take some significant amount of time to return and that would block
> the whole libvirt-dbus daemon.
>
> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> ---
> README | 1 +
> configure.ac | 12 ++
> data/Makefile.am | 5 +
> libvirt-dbus.spec.in | 6 +
> src/Makefile.am | 17 ++-
> src/gdbus.c | 393 +++++++++++++++++++++++++++++++++++++++++++++++++++
> src/gdbus.h | 95 +++++++++++++
> test/Makefile.am | 3 +-
> test/travis-run | 2 +-
> 9 files changed, 529 insertions(+), 5 deletions(-)
> create mode 100644 src/gdbus.c
> create mode 100644 src/gdbus.h
>
> diff --git a/README b/README
> index 754d957..a85114e 100644
> --- a/README
> +++ b/README
> @@ -58,6 +58,7 @@ The packages required to build libvirt-dbus are
>
> - systemd-211
> - libvirt
> + - glib2
>
> Patches submissions
> ===================
> diff --git a/configure.ac b/configure.ac
> index ba397ca..d6ed0ef 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -11,10 +11,14 @@ AC_USE_SYSTEM_EXTENSIONS
>
> AM_SILENT_RULES([yes])
>
> +GLIB2_REQUIRED=2.50.0
Is there a rational for that version, or is just what's on your OS install ?
The GBus APIs have been around alot longer than this - mostly 2.30.0 iiuc
> LIBVIRT_REQUIRED=AC_PACKAGE_VERSION
> SYSTEMD_REQUIRED=211
> +LIBVIRT_GLIB_REQUIRED=1.0.0
Same question here ?
> +AC_SUBST([GLIB2_REQUIRED]) dnl used in the .spec file
> AC_SUBST([LIBVIRT_REQUIRED]) dnl used in the .spec file
> AC_SUBST([SYSTEMD_REQUIRED]) dnl used in the .spec file
> +AC_SUBST([LIBVIRT_GLIB_REQUIRED]) dnl used in the .spec file
>
> LIBVIRT_DBUS_MAJOR_VERSION=`echo $VERSION | awk -F. '{print $1}'`
> LIBVIRT_DBUS_MINOR_VERSION=`echo $VERSION | awk -F. '{print $2}'`
> @@ -34,8 +38,11 @@ AC_PROG_MKDIR_P
> AM_PROG_CC_C_O
> AC_PROG_CC_STDC
>
> +PKG_CHECK_MODULES(GIO2, gio-unix-2.0 >= GLIB2_REQUIRED)
> +PKG_CHECK_MODULES(GLIB2, glib-2.0 >= GLIB2_REQUIRED)
> PKG_CHECK_MODULES(LIBVIRT, libvirt >= $LIBVIRT_REQUIRED)
> PKG_CHECK_MODULES(SYSTEMD, libsystemd >= $SYSTEMD_REQUIRED)
> +PKG_CHECK_MODULES(LIBVIRT_GLIB, libvirt-glib-1.0 >= LIBVIRT_GLIB_REQUIRED)
> diff --git a/src/gdbus.c b/src/gdbus.c
> new file mode 100644
> index 0000000..7dd5766
> --- /dev/null
> +++ b/src/gdbus.c
> @@ -0,0 +1,393 @@
> +#include "gdbus.h"
> +
> +#include <glib/gprintf.h>
> +
> +struct _virtDBusGDBusMethodData {
> + virtDBusGDBusMethodTable *methods;
> + virtDBusGDBusPropertyTable *properties;
> + gpointer *userData;
> +};
> +typedef struct _virtDBusGDBusMethodData virtDBusGDBusMethodData;
> +
> +struct _virtDBusGDBusSubtreeData {
> + GDBusInterfaceInfo *interface;
> + virtDBusGDBusMethodData *methodData;
> +};
> +typedef struct _virtDBusGDBusSubtreeData virtDBusGDBusSubtreeData;
> +
> +static const gchar *dbusInterfacePrefix = NULL;
> +
> +/**
> + * virtDBusGDBusLoadIntrospectData:
> + * @interface: name of the interface
> + *
> + * Reads an interface XML description from file and returns new
> + * interface info. The caller owns an reference to the returned info.
> + *
> + * The file path is constructed as:
> + *
> + * VIRT_DBUS_INTERFACES_DIR/{@interface}.xml
> + *
> + * Returns interface info on success, NULL on failure.
> + */
> +GDBusInterfaceInfo *
> +virtDBusGDBusLoadIntrospectData(gchar const *interface)
> +{
> + g_autofree gchar *introspectFile = NULL;
> + g_autofree gchar *introspectXML = NULL;
> + g_autoptr(GDBusNodeInfo) nodeInfo = NULL;
> + GDBusInterfaceInfo *ret;
> +
> + if (!dbusInterfacePrefix) {
> + dbusInterfacePrefix = g_getenv("VIRT_DBUS_INTERFACES_DIR");
> + if (!dbusInterfacePrefix)
> + dbusInterfacePrefix = VIRT_DBUS_INTERFACES_DIR;
> + }
> +
> + introspectFile = g_strdup_printf("%s/%s.xml", dbusInterfacePrefix, interface);
> + g_assert(introspectFile != NULL);
> +
> + g_file_get_contents(introspectFile, &introspectXML, NULL, NULL);
> + g_assert(introspectXML != NULL);
> +
> + nodeInfo = g_dbus_node_info_new_for_xml(introspectXML, NULL);
> + if (!nodeInfo)
> + return NULL;
> +
> + ret = nodeInfo->interfaces[0];
> + if (!ret)
> + return NULL;
> +
> + return g_dbus_interface_info_ref(ret);
> +}
My main comment would be that this is all using the low level dbus APIs
in glib, rather than the high level APIs. I can understand if that is
easier to adapt to given the existing code though.
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
More information about the libvir-list
mailing list