diff options
author | Dan Williams <dcbw@redhat.com> | 2014-06-02 10:01:39 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2014-07-22 14:39:18 -0500 |
commit | fec121fd9da5b6c25d653e0cbba4d8e9ae769d78 (patch) | |
tree | d33d48947c00bd3ebb9c95cfc5db85ee93e2779e | |
parent | 7262e606c42b239f8f2b038391971fc63128bd58 (diff) | |
download | NetworkManager-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.c | 57 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-client.h | 6 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-manager.c | 18 |
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; } |