[libvirt] [dbus PATCH v3 1/5] introduce support for GDBus implementation

Pavel Hrdina phrdina at redhat.com
Wed Mar 21 16:14:51 UTC 2018


On Wed, Mar 21, 2018 at 02:21:05PM +0000, Daniel P. Berrangé wrote:
> On Wed, Mar 21, 2018 at 11:02:43AM +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>
> > ---
> > 
> > Changes in v3:
> >   - fixed a bug while loading XML interface files, now it fails
> >     gracefully with error message
> > 
> > Changes in v2:
> >   - changed glib2 required version to 2.44.0, required for the
> >     auto-cleanup macros
> >   - changed libvirt-glib required version to 0.0.7
> > 
> >  README               |   1 +
> >  configure.ac         |  12 ++
> >  data/Makefile.am     |   5 +
> >  libvirt-dbus.spec.in |   6 +
> >  src/Makefile.am      |  17 ++-
> >  src/gdbus.c          | 398 +++++++++++++++++++++++++++++++++++++++++++++++++++
> >  src/gdbus.h          | 108 ++++++++++++++
> >  test/Makefile.am     |   3 +-
> >  test/travis-run      |   2 +-
> >  9 files changed, 547 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 df1a375..0e3bc01 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -11,10 +11,14 @@ AC_USE_SYSTEM_EXTENSIONS
> >  
> >  AM_SILENT_RULES([yes])
> >  
> > +GLIB2_REQUIRED=2.44.0
> >  LIBVIRT_REQUIRED=1.2.8
> >  SYSTEMD_REQUIRED=211
> > +LIBVIRT_GLIB_REQUIRED=0.0.7
> > +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)
> >  
> >  LIBVIRT_COMPILE_WARNINGS
> >  LIBVIRT_LINKER_RELRO
> > @@ -56,6 +63,11 @@ LIBVIRT_ARG_WITH([DBUS_SYSTEM_POLICIES], [where D-Bus system policies directory
> >  DBUS_SYSTEM_POLICIES_DIR="$with_dbus_system_policies"
> >  AC_SUBST(DBUS_SYSTEM_POLICIES_DIR)
> >  
> > +LIBVIRT_ARG_WITH([DBUS_INTERFACES], [where D-Bus interfaces directory is],
> > +                 ['$(datadir)/dbus-1/interfaces'])
> > +DBUS_INTERFACES_DIR="$with_dbus_interfaces"
> > +AC_SUBST([DBUS_INTERFACES_DIR])
> 
> FYI, you can actually get the default value for this from
> pkg-config
> 
>  $ pkgconf --variable interfaces_dir dbus-1
>  /usr/share/dbus-1/interfaces
> 
> And arguably don't need to make that configurable install dir
> at all with args. Not a blocker for this though, so fine if
> you patch that separately.
> 
> You would need a BuildRequires on dbus-devel to get the pkgconfig
> file though.

Good point, I'll send a followup patch.

> > diff --git a/data/Makefile.am b/data/Makefile.am
> > index 9a53305..a886687 100644
> > --- a/data/Makefile.am
> > +++ b/data/Makefile.am
> > @@ -18,11 +18,16 @@ polkit_files = \
> >  polkitdir = $(sysconfdir)/polkit-1/rules.d
> >  polkit_DATA = $(polkit_files:.rules.in=.rules)
> >  
> > +interfaces_files =
> > +interfacesdir = $(DBUS_INTERFACES_DIR)
> > +interfaces_DATA = $(interfaces_files)
> > +
> >  EXTRA_DIST = \
> >  	$(service_in_files) \
> >  	$(system_service_in_files) \
> >  	$(system_policy_files) \
> >  	$(polkit_files) \
> > +	$(interfaces_files) \
> >  	$(NULL)
> >  
> >  CLEANFILES = \
> > diff --git a/libvirt-dbus.spec.in b/libvirt-dbus.spec.in
> > index ce5cecf..662ece1 100644
> > --- a/libvirt-dbus.spec.in
> > +++ b/libvirt-dbus.spec.in
> > @@ -1,7 +1,9 @@
> >  # -*- rpm-spec -*-
> >  
> > +%define glib2_version @GLIB2_REQUIRED@
> >  %define libvirt_version @LIBVIRT_REQUIRED@
> >  %define systemd_version @SYSTEMD_REQUIRED@
> > +%define libvirt_glib_version @LIBVIRT_GLIB_REQUIRED@
> >  %define system_user @SYSTEM_USER@
> >  
> >  Name: @PACKAGE@
> > @@ -15,11 +17,15 @@ Source0: ftp://libvirt.org/libvirt/dbus/%{name}-%{version}.tar.gz
> >  BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
> >  
> >  BuildRequires: gcc
> > +BuildRequires: glib2-devel >= %{glib2_version}
> >  BuildRequires: libvirt-devel >= %{libvirt_version}
> >  BuildRequires: systemd-devel >= %{systemd_version}
> > +BuildRequires: libvirt-glib-devel >= %{libvirt_glib_version}
> >  
> > +Requires: glib2 >= %{glib2_version}
> >  Requires: libvirt-libs >= %{libvirt_version}
> >  Requires: systemd-libs >= %{systemd_version}
> > +Requires: libvirt-glib >= %{libvirt_glib_version}
> >  
> >  Requires(pre): shadow-utils
> >  
> > diff --git a/src/Makefile.am b/src/Makefile.am
> > index 1a5b50b..e7bba9d 100644
> > --- a/src/Makefile.am
> > +++ b/src/Makefile.am
> > @@ -1,12 +1,14 @@
> >  AM_CPPFLAGS = \
> > -	-I$(top_srcdir)/src
> > +	-I$(top_srcdir)/src \
> > +	-DVIRT_DBUS_INTERFACES_DIR=\"$(DBUS_INTERFACES_DIR)\"
> >  
> >  DAEMON_SOURCES = \
> >  	main.c \
> >  	connect.c connect.h \
> >  	util.c util.h \
> >  	domain.c domain.h \
> > -	events.c events.h
> > +	events.c events.h \
> > +	gdbus.c gdbus.h
> >  
> >  EXTRA_DIST = \
> >  	$(DAEMON_SOURCES)
> > @@ -18,18 +20,27 @@ libvirt_dbus_SOURCES = $(DAEMON_SOURCES)
> >  
> >  libvirt_dbus_CFLAGS = \
> >  	$(SYSTEMD_CFLAGS) \
> > +	$(GIO2_CFLAGS) \
> > +	$(GLIB2_CFLAGS) \
> >  	$(LIBVIRT_CFLAGS) \
> > +	$(LIBVIRT_GLIB_CFLAGS) \
> >  	$(WARN_CFLAGS) \
> >  	$(PIE_CFLAGS) \
> >  	$(NULL)
> >  
> >  libvirt_dbus_LDFLAGS = \
> >  	$(SYSTEMD_LDFLAGS) \
> > +	$(GIO2_LDFLAGS) \
> > +	$(GLIB2_LDFLAGS) \
> >  	$(LIBVIRT_LDFLAGS) \
> > +	$(LIBVIRT_GLIB_LDFLAGS) \
> >  	$(RELRO_LDFLAGS) \
> >  	$(PID_LDFLAGS) \
> >  	$(NULL)
> >  
> >  libvirt_dbus_LDADD = \
> >  	$(SYSTEMD_LIBS) \
> > -	$(LIBVIRT_LIBS)
> > +	$(GIO2_LIBS) \
> > +	$(GLIB2_LIBS) \
> > +	$(LIBVIRT_LIBS) \
> > +	$(LIBVIRT_GLIB_LIBS)
> 
> > +static void
> > +virtDBusGDBusHandlePropertyGet(GVariant *parameters,
> > +                               GDBusMethodInvocation *invocation,
> > +                               const gchar *objectPath,
> > +                               virtDBusGDBusMethodData *data)
> > +{
> > +    virtDBusGDBusPropertyGetFunc getFunc = NULL;
> > +    const gchar *interface;
> > +    const gchar *name;
> > +    GVariant *value = NULL;
> > +    GError *error = NULL;
> > +
> > +    g_variant_get(parameters, "(&s&s)", &interface, &name);
> > +
> > +    for (gint i = 0; data->properties[i].name; i++) {
> > +        if (g_strcmp0(name, data->properties[i].name) == 0) {
> 
> Nitpick   g_str_equal()  - no need to repost for that though. Sevaral
> similar cases below that I won't repeat.

I've missed this one because it's for hash tables.  The only difference
is that this one is not NULL-safe, but all the places should be already
safe not to pass NULL.

> > +            getFunc = data->properties[i].getFunc;
> > +            break;
> > +        }
> > +    }
> 
> > +void
> > +virtDBusGDBusRegisterSubtree(GDBusConnection *bus,
> > +                             gchar const *objectPath,
> > +                             GDBusInterfaceInfo *interface,
> > +                             virtDBusGDBusEnumerateFunc enumerate,
> > +                             virtDBusGDBusMethodTable *methods,
> > +                             virtDBusGDBusPropertyTable *properties,
> > +                             gpointer userData);
> 
> Not sure how much you care, but if you want libvirt-dbus APIs to
> match glib conventions, then method names would be all lowercsae
> and underscore separated

If this would by library I would use the snake_case style to match
glib conventions, but since the origin code already uses CamelCase
I was not feeling like change it.

> Regardless of comments, 
> 
>   Reviewed-by: Daniel P. Berrangé <berrange at redhat.com>

Thanks for review.

Pavel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180321/d432fa77/attachment-0001.sig>


More information about the libvir-list mailing list