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.
This commit is contained in:
Dan Williams 2014-06-02 10:01:39 -05:00
parent 7262e606c4
commit fec121fd9d
3 changed files with 14 additions and 67 deletions

View file

@ -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);
}

View file

@ -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 */

View file

@ -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;
}