NetworkManager r3857 - in trunk: . src src/dnsmasq-manager src/ppp-manager



Author: dcbw
Date: Sun Jul 27 19:42:54 2008
New Revision: 3857
URL: http://svn.gnome.org/viewvc/NetworkManager?rev=3857&view=rev

Log:
2008-07-27  Dan Williams  <dcbw redhat com>

	* src/dnsmasq-manager/nm-dnsmasq-manager.c
	  src/nm-device.c
	  src/ppp-manager/nm-ppp-manager.c
		- Ensure child process gets reaped.  The child watch function may be
			removed from the mainloop before the child gets killed, so we have
			to make sure the child is reaped when it's told to die intentionally



Modified:
   trunk/ChangeLog
   trunk/src/dnsmasq-manager/nm-dnsmasq-manager.c
   trunk/src/nm-device.c
   trunk/src/ppp-manager/nm-ppp-manager.c

Modified: trunk/src/dnsmasq-manager/nm-dnsmasq-manager.c
==============================================================================
--- trunk/src/dnsmasq-manager/nm-dnsmasq-manager.c	(original)
+++ trunk/src/dnsmasq-manager/nm-dnsmasq-manager.c	Sun Jul 27 19:42:54 2008
@@ -357,7 +357,6 @@
 	NMDnsMasqManagerPrivate *priv;
 	NMCmdLine *dm_cmd;
 	char *cmd_str;
-	GSource *dm_watch;
 
 	g_return_val_if_fail (NM_IS_DNSMASQ_MANAGER (manager), FALSE);
 	if (error)
@@ -389,11 +388,7 @@
 
 	nm_debug ("dnsmasq started with pid %d", priv->pid);
 
-	dm_watch = g_child_watch_source_new (priv->pid);
-	g_source_set_callback (dm_watch, (GSourceFunc) dm_watch_cb, manager, NULL);
-	g_source_attach (dm_watch, NULL);
-	priv->dm_watch_id = g_source_get_id (dm_watch);
-	g_source_unref (dm_watch);
+	priv->dm_watch_id = g_child_watch_add (priv->pid, (GChildWatchFunc) dm_watch_cb, manager);
 
  out:
 	if (dm_cmd)
@@ -410,6 +405,9 @@
 	if (kill (pid, 0) == 0)
 		kill (pid, SIGKILL);
 
+	/* ensure child is reaped */
+	waitpid (pid, NULL, WNOHANG);
+
 	return FALSE;
 }
 
@@ -433,6 +431,8 @@
 		else
 			kill (priv->pid, SIGKILL);
 
+		/* ensure child is reaped */
+		waitpid (priv->pid, NULL, WNOHANG);
 		priv->pid = 0;
 	}
 

Modified: trunk/src/nm-device.c
==============================================================================
--- trunk/src/nm-device.c	(original)
+++ trunk/src/nm-device.c	Sun Jul 27 19:42:54 2008
@@ -551,16 +551,18 @@
 {
 	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
 
-	if (priv->aipd_pid > 0) {
-		kill (priv->aipd_pid, SIGKILL);
-		priv->aipd_pid = -1;
-	}
-
 	if (priv->aipd_watch) {
 		g_source_remove (priv->aipd_watch);
 		priv->aipd_watch = 0;
 	}
 
+	if (priv->aipd_pid > 0) {
+		kill (priv->aipd_pid, SIGKILL);
+		/* Ensure child is reaped */
+		waitpid (priv->aipd_pid, NULL, WNOHANG);
+		priv->aipd_pid = -1;
+	}
+
 	aipd_timeout_remove (self);
 
 	priv->aipd_addr = 0;

Modified: trunk/src/ppp-manager/nm-ppp-manager.c
==============================================================================
--- trunk/src/ppp-manager/nm-ppp-manager.c	(original)
+++ trunk/src/ppp-manager/nm-ppp-manager.c	Sun Jul 27 19:42:54 2008
@@ -737,7 +737,6 @@
 	NMSettingPPPOE *pppoe_setting;
 	NMCmdLine *ppp_cmd;
 	char *cmd_str;
-	GSource *ppp_watch;
 
 	g_return_val_if_fail (NM_IS_PPP_MANAGER (manager), FALSE);
 	g_return_val_if_fail (device != NULL, FALSE);
@@ -775,12 +774,7 @@
 
 	nm_debug ("ppp started with pid %d", priv->pid);
 
-	ppp_watch = g_child_watch_source_new (priv->pid);
-	g_source_set_callback (ppp_watch, (GSourceFunc) ppp_watch_cb, manager, NULL);
-	g_source_attach (ppp_watch, NULL);
-	priv->ppp_watch_id = g_source_get_id (ppp_watch);
-	g_source_unref (ppp_watch);
-
+	priv->ppp_watch_id = g_child_watch_add (priv->pid, (GChildWatchFunc) ppp_watch_cb, manager);
 	priv->ppp_timeout_handler = g_timeout_add (NM_PPP_WAIT_PPPD, pppd_timed_out, manager);
 	priv->act_req = g_object_ref (req);
 
@@ -842,6 +836,9 @@
 	if (kill (pid, 0) == 0)
 		kill (pid, SIGKILL);
 
+	/* ensure the child is reaped */
+	waitpid (pid, NULL, WNOHANG);
+
 	return FALSE;
 }
 
@@ -881,8 +878,11 @@
 	if (priv->pid) {
 		if (kill (priv->pid, SIGTERM) == 0)
 			g_timeout_add (2000, ensure_killed, GINT_TO_POINTER (priv->pid));
-		else
+		else {
 			kill (priv->pid, SIGKILL);
+			/* ensure the child is reaped */
+			waitpid (priv->pid, NULL, WNOHANG);
+		}
 
 		priv->pid = 0;
 	}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]