2006-11-25 Dan Williams <dcbw@redhat.com>
Rework DBus manager signal handling to be more flexible. Previously, only one signal handler could be registered for a particular interface. The DBus manager now reference counts DBus bus matches and allows multiple clients to register signal handlers for the same interface and sender. * src/NetworkManager.c - (main): track NMI signal handler ID and remove it when we quit * src/NetworkManagerMain.h - Keep track of NMI signal handler ID * src/nm-dbus-manager.c src/nm-dbus-manager.h - rework signal handling; each signal handler references one signal match, but a signal match may be referenced by one or more signal handlers. Matches are refcounted and are destroyed when the last signal handler that references the match is removed. This is necessary because two signal handlers may end up requiring the same dbus bus match, so the match must live until the last signal handler is destroyed (for example, with the wpa_supplicant network interface dbus interface). * src/dhcp-manager/nm-dhcp-manager.c - (nm_dhcp_manager_new): track DHCP signal handler id - (nm_dhcp_manager_dispose): remove DHCP signal handler * src/vpn-manager/nm-vpn-service.c - (nm_vpn_service_add_watch): track VPN service signal handler id - (nm_vpn_service_remove_watch): remove VPN service signal handler git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@2124 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
@@ -744,6 +744,7 @@ main (int argc, char *argv[])
|
||||
NMDBusManager * dbus_mgr;
|
||||
DBusConnection *dbus_connection;
|
||||
int exit_status = EXIT_FAILURE;
|
||||
guint32 id;
|
||||
|
||||
GOptionEntry options[] = {
|
||||
{"no-daemon", 0, 0, G_OPTION_ARG_NONE, &become_daemon, "Don't become a daemon", NULL},
|
||||
@@ -831,11 +832,12 @@ main (int argc, char *argv[])
|
||||
G_CALLBACK (nm_name_owner_changed_handler), nm_data);
|
||||
g_signal_connect (G_OBJECT (dbus_mgr), "dbus-connection-changed",
|
||||
G_CALLBACK (nm_dbus_connection_changed_handler), nm_data);
|
||||
nm_dbus_manager_register_signal_handler (dbus_mgr,
|
||||
NMI_DBUS_INTERFACE,
|
||||
NULL,
|
||||
nm_dbus_nmi_signal_handler,
|
||||
nm_data);
|
||||
id = nm_dbus_manager_register_signal_handler (dbus_mgr,
|
||||
NMI_DBUS_INTERFACE,
|
||||
NULL,
|
||||
nm_dbus_nmi_signal_handler,
|
||||
nm_data);
|
||||
nm_data->nmi_sig_handler_id = id;
|
||||
|
||||
/* Register DBus method handlers for the main NM objects */
|
||||
nm_data->nm_methods = nm_dbus_nm_methods_setup (nm_data);
|
||||
@@ -901,6 +903,9 @@ main (int argc, char *argv[])
|
||||
|
||||
done:
|
||||
nm_print_open_socks ();
|
||||
|
||||
nm_dbus_manager_remove_signal_handler (dbus_mgr, nm_data->nmi_sig_handler_id);
|
||||
|
||||
nm_data_free (nm_data);
|
||||
/* nm_data_free needs the dbus connection, so must kill the
|
||||
* dbus manager after that.
|
||||
|
Reference in New Issue
Block a user