diff options
author | Dan Williams <dcbw@redhat.com> | 2012-06-05 11:29:04 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2012-09-11 17:17:58 -0500 |
commit | d42d41c1ac646e7668f28c0cb14093edb9e03e23 (patch) | |
tree | a179998481ae7191f25950513836040c10540ec4 /src/nm-dispatcher.c | |
parent | 15ca7cd56cedf03d43b9dc2efb10dc669abb3146 (diff) | |
download | NetworkManager-d42d41c1ac646e7668f28c0cb14093edb9e03e23.tar.gz |
core: add cancelation to dispatcher calls
Diffstat (limited to 'src/nm-dispatcher.c')
-rw-r--r-- | src/nm-dispatcher.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/nm-dispatcher.c b/src/nm-dispatcher.c index a3674a1501..0f17ed93f3 100644 --- a/src/nm-dispatcher.c +++ b/src/nm-dispatcher.c @@ -30,6 +30,8 @@ #include "nm-dbus-manager.h" #include "nm-dbus-glib-types.h" +static GSList *requests = NULL; + static void dump_object_to_props (GObject *object, GHashTable *hash) { @@ -137,6 +139,7 @@ typedef struct { static void dispatcher_info_free (DispatchInfo *info) { + requests = g_slist_remove (requests, info); g_object_unref (info->dbus_mgr); g_free (info); } @@ -206,7 +209,7 @@ dispatcher_done_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) } if (info->callback) - info->callback (call, info->user_data); + info->callback (info, info->user_data); g_clear_error (&error); g_object_unref (proxy); @@ -240,7 +243,7 @@ action_to_string (DispatcherAction action) g_assert_not_reached (); } -static gpointer +static gconstpointer _dispatcher_call (DispatcherAction action, NMConnection *connection, NMDevice *device, @@ -349,10 +352,13 @@ _dispatcher_call (DispatcherAction action, g_hash_table_destroy (vpn_ip4_props); g_hash_table_destroy (vpn_ip6_props); - return call; + /* Track the request in case of cancelation */ + requests = g_slist_append (requests, info); + + return info; } -gpointer +gconstpointer nm_dispatcher_call (DispatcherAction action, NMConnection *connection, NMDevice *device, @@ -362,7 +368,7 @@ nm_dispatcher_call (DispatcherAction action, return _dispatcher_call (action, connection, device, NULL, NULL, NULL, callback, user_data); } -gpointer +gconstpointer nm_dispatcher_call_vpn (DispatcherAction action, NMConnection *connection, NMDevice *device, @@ -375,3 +381,16 @@ nm_dispatcher_call_vpn (DispatcherAction action, return _dispatcher_call (action, connection, device, vpn_iface, vpn_ip4_config, vpn_ip6_config, callback, user_data); } +void +nm_dispatcher_call_cancel (gconstpointer call) +{ + /* 'call' is really a DispatchInfo pointer, just opaque to callers. + * Look it up in our requests list, but don't access it directly before + * we've made sure it's a valid request,since it may have long since been + * freed. Canceling just means the callback doesn't get called, so set + * the DispatcherInfo's callback to NULL. + */ + if (g_slist_find (requests, call)) + ((DispatchInfo *) call)->callback = NULL; +} + |