summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-06-02 10:01:39 -0500
committerDan Williams <dcbw@redhat.com>2014-07-22 14:39:18 -0500
commitfec121fd9da5b6c25d653e0cbba4d8e9ae769d78 (patch)
treed33d48947c00bd3ebb9c95cfc5db85ee93e2779e
parent7262e606c42b239f8f2b038391971fc63128bd58 (diff)
downloadNetworkManager-fec121fd9da5b6c25d653e0cbba4d8e9ae769d78.tar.gz
dhcp: remove the client REMOVE signal
Instead of using a separate signal for it, just drop and release the client object when it reaches terminate states like TIMEOUT, FAIL, and DONE. The 5 second removal signal timeout appears to no longer be necessary, since the running child process is killed synchronously.
-rw-r--r--src/dhcp-manager/nm-dhcp-client.c57
-rw-r--r--src/dhcp-manager/nm-dhcp-client.h6
-rw-r--r--src/dhcp-manager/nm-dhcp-manager.c18
3 files changed, 14 insertions, 67 deletions
diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
index 30de08859a..9d88e2a8ef 100644
--- a/src/dhcp-manager/nm-dhcp-client.c
+++ b/src/dhcp-manager/nm-dhcp-client.c
@@ -48,7 +48,6 @@ typedef struct {
pid_t pid;
guint timeout_id;
guint watch_id;
- guint remove_id;
GHashTable * options;
gboolean info_only;
@@ -60,7 +59,6 @@ G_DEFINE_TYPE_EXTENDED (NMDHCPClient, nm_dhcp_client, G_TYPE_OBJECT, G_TYPE_FLAG
enum {
SIGNAL_STATE_CHANGED,
- SIGNAL_REMOVE,
LAST_SIGNAL
};
@@ -173,35 +171,11 @@ stop (NMDHCPClient *self, gboolean release, const GByteArray *duid)
priv->info_only = FALSE;
}
-static gboolean
-signal_remove (gpointer user_data)
-{
- NMDHCPClient *self = NM_DHCP_CLIENT (user_data);
-
- NM_DHCP_CLIENT_GET_PRIVATE (self)->remove_id = 0;
- g_signal_emit (G_OBJECT (self), signals[SIGNAL_REMOVE], 0);
- return FALSE;
-}
-
void
-nm_dhcp_client_set_state (NMDHCPClient *self,
- NMDhcpState state,
- gboolean remove_now)
+nm_dhcp_client_set_state (NMDHCPClient *self, NMDhcpState state)
{
- NMDHCPClientPrivate *priv = NM_DHCP_CLIENT_GET_PRIVATE (self);
-
- priv->state = state;
- g_signal_emit (G_OBJECT (self), signals[SIGNAL_STATE_CHANGED], 0, priv->state);
-
- if (state == NM_DHCP_STATE_DONE || state == NM_DHCP_STATE_FAIL) {
- /* Start the remove signal timer */
- if (remove_now) {
- g_signal_emit (G_OBJECT (self), signals[SIGNAL_REMOVE], 0);
- } else {
- if (!priv->remove_id)
- priv->remove_id = g_timeout_add_seconds (5, signal_remove, self);
- }
- }
+ NM_DHCP_CLIENT_GET_PRIVATE (self)->state = state;
+ g_signal_emit (G_OBJECT (self), signals[SIGNAL_STATE_CHANGED], 0, state);
}
static gboolean
@@ -215,7 +189,7 @@ daemon_timeout (gpointer user_data)
"(%s): DHCPv%c request timed out.",
priv->iface,
priv->ipv6 ? '6' : '4');
- nm_dhcp_client_set_state (self, NM_DHCP_STATE_TIMEOUT, FALSE);
+ nm_dhcp_client_set_state (self, NM_DHCP_STATE_TIMEOUT);
return G_SOURCE_REMOVE;
}
@@ -246,7 +220,7 @@ daemon_watch_cb (GPid pid, gint status, gpointer user_data)
timeout_cleanup (self);
priv->pid = -1;
- nm_dhcp_client_set_state (self, new_state, FALSE);
+ nm_dhcp_client_set_state (self, new_state);
}
void
@@ -514,11 +488,11 @@ nm_dhcp_client_stop (NMDHCPClient *self, gboolean release)
g_assert (priv->pid == -1);
/* And clean stuff up */
- nm_dhcp_client_set_state (self, NM_DHCP_STATE_DONE, TRUE);
-
g_hash_table_remove_all (priv->options);
timeout_cleanup (self);
watch_cleanup (self);
+
+ nm_dhcp_client_set_state (self, NM_DHCP_STATE_DONE);
}
/********************************************/
@@ -658,7 +632,7 @@ nm_dhcp_client_new_options (NMDHCPClient *self,
state_to_string (old_state),
state_to_string (new_state));
- nm_dhcp_client_set_state (self, new_state, FALSE);
+ nm_dhcp_client_set_state (self, new_state);
}
#define NEW_TAG "new_"
@@ -1500,10 +1474,8 @@ dispose (GObject *object)
* the DHCP client.
*/
- if (priv->remove_id) {
- g_source_remove (priv->remove_id);
- priv->remove_id = 0;
- }
+ watch_cleanup (self);
+ timeout_cleanup (self);
if (priv->options) {
g_hash_table_destroy (priv->options);
@@ -1595,14 +1567,5 @@ nm_dhcp_client_class_init (NMDHCPClientClass *client_class)
G_STRUCT_OFFSET (NMDHCPClientClass, state_changed),
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
-
- signals[SIGNAL_REMOVE] =
- g_signal_new (NM_DHCP_CLIENT_SIGNAL_REMOVE,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (NMDHCPClientClass, remove),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
}
diff --git a/src/dhcp-manager/nm-dhcp-client.h b/src/dhcp-manager/nm-dhcp-client.h
index b5982e4800..e7b3051e00 100644
--- a/src/dhcp-manager/nm-dhcp-client.h
+++ b/src/dhcp-manager/nm-dhcp-client.h
@@ -43,7 +43,6 @@
#define NM_DHCP_CLIENT_TIMEOUT "timeout"
#define NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED "state-changed"
-#define NM_DHCP_CLIENT_SIGNAL_REMOVE "remove"
typedef enum {
NM_DHCP_STATE_UNKNOWN = 0,
@@ -92,7 +91,6 @@ typedef struct {
/* Signals */
void (*state_changed) (NMDHCPClient *self, NMDhcpState state);
- void (*remove) (NMDHCPClient *self);
} NMDHCPClientClass;
GType nm_dhcp_client_get_type (void);
@@ -138,9 +136,7 @@ void nm_dhcp_client_stop_pid (pid_t pid, const char *iface);
void nm_dhcp_client_watch_child (NMDHCPClient *self, pid_t pid);
-void nm_dhcp_client_set_state (NMDHCPClient *self,
- NMDhcpState state,
- gboolean remove_now);
+void nm_dhcp_client_set_state (NMDHCPClient *self, NMDhcpState state);
#endif /* NM_DHCP_CLIENT_H */
diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c
index 4345bdc355..85693b288b 100644
--- a/src/dhcp-manager/nm-dhcp-manager.c
+++ b/src/dhcp-manager/nm-dhcp-manager.c
@@ -344,7 +344,6 @@ static void client_state_changed (NMDHCPClient *client, NMDhcpState state, NMDHC
static void
remove_client (NMDHCPManager *self, NMDHCPClient *client)
{
- g_signal_handlers_disconnect_by_func (client, remove_client, self);
g_signal_handlers_disconnect_by_func (client, client_state_changed, self);
/* Stopping the client is left up to the controlling device
@@ -358,20 +357,10 @@ remove_client (NMDHCPManager *self, NMDHCPClient *client)
static void
client_state_changed (NMDHCPClient *client, NMDhcpState state, NMDHCPManager *self)
{
- if (state == NM_DHCP_STATE_TIMEOUT)
+ if (state >= NM_DHCP_STATE_TIMEOUT)
remove_client (self, client);
}
-static void
-add_client (NMDHCPManager *self, NMDHCPClient *client)
-{
- NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self);
-
- g_signal_connect_swapped (client, NM_DHCP_CLIENT_SIGNAL_REMOVE, G_CALLBACK (remove_client), self);
- g_signal_connect (client, NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED, G_CALLBACK (client_state_changed), self);
- g_hash_table_insert (priv->clients, client, g_object_ref (client));
-}
-
static NMDHCPClient *
client_start (NMDHCPManager *self,
const char *iface,
@@ -419,8 +408,8 @@ client_start (NMDHCPManager *self,
NM_DHCP_CLIENT_PRIORITY, priority,
NM_DHCP_CLIENT_TIMEOUT, timeout ? timeout : DHCP_TIMEOUT,
NULL);
- g_return_val_if_fail (client != NULL, NULL);
- add_client (self, client);
+ g_hash_table_insert (NM_DHCP_MANAGER_GET_PRIVATE (self)->clients, client, g_object_ref (client));
+ g_signal_connect (client, NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED, G_CALLBACK (client_state_changed), self);
if (ipv6)
success = nm_dhcp_client_start_ip6 (client, dhcp_anycast_addr, hostname, info_only);
@@ -429,7 +418,6 @@ client_start (NMDHCPManager *self,
if (!success) {
remove_client (self, client);
- g_object_unref (client);
client = NULL;
}