[NetworkManager/f20] wwan: let systemd manage the ModemManager life-cycle (rh #1018017)

Daniel Williams dcbw at fedoraproject.org
Tue Jul 29 19:13:20 UTC 2014


commit 29e938dcd1a1419b1aca78f7d171cccf44620666
Author: Dan Williams <dcbw at redhat.com>
Date:   Tue Jul 29 14:13:05 2014 -0500

    wwan: let systemd manage the ModemManager life-cycle (rh #1018017)

 0073-rh1018017-let-systemd-manage-mm.patch |  282 ++++++++++++++++++++++++++++
 NetworkManager.spec                        |    7 +-
 2 files changed, 288 insertions(+), 1 deletions(-)
---
diff --git a/0073-rh1018017-let-systemd-manage-mm.patch b/0073-rh1018017-let-systemd-manage-mm.patch
new file mode 100644
index 0000000..a225c47
--- /dev/null
+++ b/0073-rh1018017-let-systemd-manage-mm.patch
@@ -0,0 +1,282 @@
+From 3b76ae18a52b44dbe577557e038fdc263edc5715 Mon Sep 17 00:00:00 2001
+From: Aleksander Morgado <aleksander at lanedo.com>
+Date: Thu, 31 Oct 2013 09:14:13 +0100
+Subject: [PATCH] modem-manager: if building systemd support, assume it manages
+ the MM lifecycle
+
+We will not explicitly poke MM to start it if NetworkManager is built with
+systemd support.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=703040
+---
+ configure.ac                         |  3 ++
+ src/modem-manager/nm-modem-manager.c | 71 ++++++++++++++++++++++--------------
+ 2 files changed, 47 insertions(+), 27 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 174b6bf..895ab09 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -300,14 +300,17 @@ AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=
+ AS_IF([test -z "$with_systemdsystemunitdir" && $PKG_CONFIG systemd],
+ 	with_systemdsystemunitdir="\$(prefix)/lib/systemd/system")
+ AS_IF([test -z "$with_systemdsystemunitdir"], with_systemdsystemunitdir=no)
+ # add conditional and subst
+ AM_CONDITIONAL(HAVE_SYSTEMD, [test "$with_systemdsystemunitdir" != no])
+ if test "$with_systemdsystemunitdir" != no; then
+ 	AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
++	AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd support is available])
++else
++	AC_DEFINE(HAVE_SYSTEMD, 0, [Define if systemd support is available])
+ fi
+ 
+ PKG_CHECK_MODULES(SYSTEMD_200, [systemd >= 200], [have_systemd_200=yes],[have_systemd_200=no])
+ AM_CONDITIONAL(HAVE_SYSTEMD_200, test "${have_systemd_200}" = "yes")
+ 
+ # session tracking support
+ AC_MSG_CHECKING([Session tracking support])
+diff --git a/src/modem-manager/nm-modem-manager.c b/src/modem-manager/nm-modem-manager.c
+index 427d98c..bb85b77 100644
+--- a/src/modem-manager/nm-modem-manager.c
++++ b/src/modem-manager/nm-modem-manager.c
+@@ -45,15 +45,15 @@ struct _NMModemManagerPrivate {
+ 	DBusGProxy *proxy;
+ 	guint poke_id;
+ 
+ #if WITH_MODEM_MANAGER_1
+ 	/* ModemManager >= 0.7 */
+ 	GDBusConnection *dbus_connection;
+ 	MMManager *modem_manager_1;
+-	guint modem_manager_1_poke_id;
++	guint modem_manager_1_launch_id;
+ 	gboolean old_modem_manager_found;
+ 	gboolean new_modem_manager_found;
+ 	guint modem_manager_1_name_owner_changed_id;
+ 	guint modem_manager_1_object_added_id;
+ 	guint modem_manager_1_object_removed_id;
+ #endif
+ 
+@@ -355,17 +355,17 @@ modem_manager_1_clear_signals (NMModemManager *self)
+ 		self->priv->modem_manager_1_object_removed_id = 0;
+ 	}
+ }
+ 
+ static void
+ clear_modem_manager_1_support (NMModemManager *self)
+ {
+-	if (self->priv->modem_manager_1_poke_id) {
+-		g_source_remove (self->priv->modem_manager_1_poke_id);
+-		self->priv->modem_manager_1_poke_id = 0;
++	if (self->priv->modem_manager_1_launch_id) {
++		g_source_remove (self->priv->modem_manager_1_launch_id);
++		self->priv->modem_manager_1_launch_id = 0;
+ 	}
+ 
+ 	modem_manager_1_clear_signals (self);
+ 	g_clear_object (&self->priv->modem_manager_1);
+ 	g_clear_object (&self->priv->dbus_connection);
+ }
+ 
+@@ -458,23 +458,28 @@ static void
+ modem_manager_1_name_owner_changed (MMManager *modem_manager_1,
+                                     GParamSpec *pspec,
+                                     NMModemManager *self)
+ {
+ 	gchar *name_owner;
+ 
+ 	/* Quit poking, if any */
+-	if (self->priv->modem_manager_1_poke_id) {
+-		g_source_remove (self->priv->modem_manager_1_poke_id);
+-		self->priv->modem_manager_1_poke_id = 0;
++	if (self->priv->modem_manager_1_launch_id) {
++		g_source_remove (self->priv->modem_manager_1_launch_id);
++		self->priv->modem_manager_1_launch_id = 0;
+ 	}
+ 
+ 	name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (modem_manager_1));
+ 	if (!name_owner) {
+ 		nm_log_info (LOGD_MB, "ModemManager disappeared from bus");
++
++#if !HAVE_SYSTEMD
++		/* If not managed by systemd, schedule relaunch */
+ 		schedule_modem_manager_1_relaunch (self, 0);
++#endif
++
+ 		return;
+ 	}
+ 
+ 	/* Available! */
+ 	g_free (name_owner);
+ 
+ 	/* Hack alert: GDBusObjectManagerClient won't signal neither 'object-added'
+@@ -486,14 +491,16 @@ modem_manager_1_name_owner_changed (MMManager *modem_manager_1,
+ 	ensure_client (self);
+ 
+ 	/* Whenever GDBusObjectManagerClient is fixed, we can just do the following:
+ 	 * modem_manager_1_available (self);
+ 	 */
+ }
+ 
++#if !HAVE_SYSTEMD
++
+ static void
+ modem_manager_1_poke_cb (GDBusConnection *connection,
+                          GAsyncResult *res,
+                          NMModemManager *self)
+ {
+ 	GError *error = NULL;
+ 	GVariant *result;
+@@ -519,40 +526,50 @@ modem_manager_1_poke_cb (GDBusConnection *connection,
+ 	/* Balance refcount */
+ 	g_object_unref (self);
+ }
+ 
+ static void
+ modem_manager_1_poke (NMModemManager *self)
+ {
+-	gchar *name_owner;
+-
+ 	/* If there is no current owner right away, ensure we poke to get one */
+-	name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (self->priv->modem_manager_1));
+-	if (name_owner) {
+-		/* Available! */
+-		modem_manager_1_available (self);
+-		g_free (name_owner);
+-		return;
+-	}
+-
+-	/* Poke! */
+ 	g_dbus_connection_call (self->priv->dbus_connection,
+ 	                        "org.freedesktop.ModemManager1",
+ 	                        "/org/freedesktop/ModemManager1",
+ 	                        "org.freedesktop.DBus.Peer",
+ 	                        "Ping",
+ 	                        NULL, /* inputs */
+ 	                        NULL, /* outputs */
+ 	                        G_DBUS_CALL_FLAGS_NONE,
+ 	                        -1,
+ 	                        NULL, /* cancellable */
+ 	                        (GAsyncReadyCallback)modem_manager_1_poke_cb, /* callback */
+ 	                        g_object_ref (self)); /* user_data */
+ }
+ 
++#endif /* HAVE_SYSTEMD */
++
++static void
++modem_manager_1_check_name_owner (NMModemManager *self)
++{
++	gchar *name_owner;
++
++	name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (self->priv->modem_manager_1));
++	if (name_owner) {
++		/* Available! */
++		modem_manager_1_available (self);
++		g_free (name_owner);
++		return;
++	}
++
++#if !HAVE_SYSTEMD
++	/* If the lifecycle is not managed by systemd, poke */
++	modem_manager_1_poke (self);
++#endif
++}
++
+ static void
+ manager_new_ready (GObject *source,
+                    GAsyncResult *res,
+                    NMModemManager *self)
+ {
+ 	/* Note we always get an extra reference to self here */
+ 
+@@ -584,16 +601,16 @@ manager_new_ready (GObject *source,
+ 			                  G_CALLBACK (modem_object_added),
+ 			                  self);
+ 		self->priv->modem_manager_1_object_removed_id =
+ 			g_signal_connect (self->priv->modem_manager_1,
+ 			                  "object-removed",
+ 			                  G_CALLBACK (modem_object_removed),
+ 			                  self);
+-		/* Poke the MMManager! */
+-		modem_manager_1_poke (self);
++
++		modem_manager_1_check_name_owner (self);
+ 	}
+ 
+ 	/* Balance refcount */
+ 	g_object_unref (self);
+ }
+ 
+ static void
+@@ -609,16 +626,16 @@ ensure_client (NMModemManager *self)
+ 		                G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START,
+ 		                NULL,
+ 		                (GAsyncReadyCallback)manager_new_ready,
+ 		                g_object_ref (self));
+ 		return;
+ 	}
+ 
+-	/* If already available, poke! */
+-	modem_manager_1_poke (self);
++	/* If already available, recheck name owner! */
++	modem_manager_1_check_name_owner (self);
+ }
+ 
+ static void
+ bus_get_ready (GObject *source,
+                GAsyncResult *res,
+                NMModemManager *self)
+ {
+@@ -632,27 +649,27 @@ bus_get_ready (GObject *source,
+ 		g_error_free (error);
+ 		/* Setup timeout to relaunch */
+ 		schedule_modem_manager_1_relaunch (self, MODEM_POKE_INTERVAL);
+ 	} else if (self->priv->old_modem_manager_found) {
+ 		/* If we found the old MM, abort */
+ 		clear_modem_manager_1_support (self);
+ 	} else {
+-		/* Got the bus, create new ModemManager client. */
++		/* Got the bus, ensure client */
+ 		ensure_client (self);
+ 	}
+ 
+ 	/* Balance refcount */
+ 	g_object_unref (self);
+ }
+ 
+ static gboolean
+ ensure_bus (NMModemManager *self)
+ {
+-	/* Clear poke ID */
+-	self->priv->modem_manager_1_poke_id = 0;
++	/* Clear launch ID */
++	self->priv->modem_manager_1_launch_id = 0;
+ 
+ 	if (!self->priv->dbus_connection)
+ 		g_bus_get (G_BUS_TYPE_SYSTEM,
+ 		           NULL,
+ 		           (GAsyncReadyCallback)bus_get_ready,
+ 		           g_object_ref (self));
+ 	else
+@@ -666,17 +683,17 @@ static void
+ schedule_modem_manager_1_relaunch (NMModemManager *self,
+                                    guint n_seconds)
+ {
+ 	/* No need to pass an extra reference to self; timeout/idle will be
+ 	 * cancelled if the object gets disposed. */
+ 
+ 	if (n_seconds)
+-		self->priv->modem_manager_1_poke_id = g_timeout_add_seconds (n_seconds, (GSourceFunc)ensure_bus, self);
++		self->priv->modem_manager_1_launch_id = g_timeout_add_seconds (n_seconds, (GSourceFunc)ensure_bus, self);
+ 	else
+-		self->priv->modem_manager_1_poke_id = g_idle_add ((GSourceFunc)ensure_bus, self);
++		self->priv->modem_manager_1_launch_id = g_idle_add ((GSourceFunc)ensure_bus, self);
+ }
+ 
+ #endif /* WITH_MODEM_MANAGER_1 */
+ 
+ /************************************************************************/
+ 
+ static void
+-- 
+1.9.3
+
diff --git a/NetworkManager.spec b/NetworkManager.spec
index 03b9b1b..2422d23 100644
--- a/NetworkManager.spec
+++ b/NetworkManager.spec
@@ -46,7 +46,7 @@ Name: NetworkManager
 Summary: Network connection manager and user applications
 Epoch: 1
 Version: 0.9.9.0
-Release: 42%{snapshot}%{?dist}
+Release: 43%{snapshot}%{?dist}
 Group: System Environment/Base
 License: GPLv2+
 URL: http://www.gnome.org/projects/NetworkManager/
@@ -128,6 +128,7 @@ Patch69: 0069-rh1115538-fix-supplicant-crash-for-AddBlob.patch
 Patch70: 0070-rh1047083-handle-mtu-for-ip4-config-merge-and-subtract.patch
 Patch71: 0071-fix-connectivity-notification.patch
 Patch72: 0072-rh1010288-nm_client_new-fix.patch
+Patch73: 0073-rh1018017-let-systemd-manage-mm.patch
 
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
@@ -374,6 +375,7 @@ by nm-connection-editor and nm-applet in a non-graphical environment.
 %patch70 -p1 -b .0070-rh1047083-handle-mtu-for-ip4-config-merge-and-subtract.orig
 %patch71 -p1 -b .0071-fix-connectivity-notification.orig
 %patch72 -p1 -b .0072-rh1010288-nm_client_new-fix.orig
+%patch73 -p1 -b .0073-rh1018017-let-systemd-manage-mm.orig
 
 %build
 
@@ -607,6 +609,9 @@ fi
 %endif
 
 %changelog
+* Tue Jul 29 2014 Dan Williams <dcbw at redhat.com> - 0.9.9.0-43.git20131003
+- wwan: let systemd manage the ModemManager life-cycle (rh #1018017)
+
 * Thu Jul 24 2014 Jiří Klimeš <jklimes at redhat.com> - 0.9.9.0-42.git20131003
 - libnm-glib: fix a crash in nm_client_new() (rh #1010288) (rh #1122593)
 - manager: fix notification of the connectivity property


More information about the scm-commits mailing list