diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2013-04-18 23:34:03 +0300 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2013-05-03 23:42:29 -0700 |
commit | c26a6862d8e9dbeac60c4ef0db1e88e06879a7b7 (patch) | |
tree | d44b3524c95fdf1418fcad56a97f7bbd27a2ebd7 | |
parent | 74640d6e0a42ccbf8e8557836e84f81a4f4375d1 (diff) | |
download | connman-c26a6862d8e9dbeac60c4ef0db1e88e06879a7b7.tar.gz connman-c26a6862d8e9dbeac60c4ef0db1e88e06879a7b7.tar.bz2 connman-c26a6862d8e9dbeac60c4ef0db1e88e06879a7b7.zip |
gdbus: Fix calling GetManagedObjects twice in a row
Calling g_dbus_client_new followed by g_dbus_client_set_proxy_handlers
cause two calls to GetManagedObjects in a row as GetNameOwner reply is
asyncronously it triggers the second call because the handlers have
been set by g_dbus_client_set_proxy_handlers.
-rw-r--r-- | gdbus/client.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/gdbus/client.c b/gdbus/client.c index c2d23462..55f1d892 100644 --- a/gdbus/client.c +++ b/gdbus/client.c @@ -40,6 +40,7 @@ struct GDBusClient { char *base_path; GPtrArray *match_rules; DBusPendingCall *pending_call; + DBusPendingCall *get_objects_call; GDBusWatchFunction connect_func; void *connect_data; GDBusWatchFunction disconn_func; @@ -992,6 +993,8 @@ static void get_managed_objects_reply(DBusPendingCall *call, void *user_data) DBusMessage *reply = dbus_pending_call_steal_reply(call); DBusError error; + g_dbus_client_ref(client); + dbus_error_init(&error); if (dbus_set_error_from_message(&error, reply) == TRUE) { @@ -1004,19 +1007,24 @@ static void get_managed_objects_reply(DBusPendingCall *call, void *user_data) done: dbus_message_unref(reply); + dbus_pending_call_unref(client->get_objects_call); + client->get_objects_call = NULL; + g_dbus_client_unref(client); } static void get_managed_objects(GDBusClient *client) { DBusMessage *msg; - DBusPendingCall *call; if (!client->proxy_added && !client->proxy_removed) { refresh_properties(client); return; } + if (client->get_objects_call != NULL) + return; + msg = dbus_message_new_method_call(client->service_name, "/", DBUS_INTERFACE_DBUS ".ObjectManager", "GetManagedObjects"); @@ -1026,16 +1034,14 @@ static void get_managed_objects(GDBusClient *client) dbus_message_append_args(msg, DBUS_TYPE_INVALID); if (dbus_connection_send_with_reply(client->dbus_conn, msg, - &call, -1) == FALSE) { + &client->get_objects_call, -1) == FALSE) { dbus_message_unref(msg); return; } - g_dbus_client_ref(client); - - dbus_pending_call_set_notify(call, get_managed_objects_reply, - client, NULL); - dbus_pending_call_unref(call); + dbus_pending_call_set_notify(client->get_objects_call, + get_managed_objects_reply, + client, NULL); dbus_message_unref(msg); } @@ -1285,6 +1291,11 @@ void g_dbus_client_unref(GDBusClient *client) dbus_pending_call_unref(client->pending_call); } + if (client->get_objects_call != NULL) { + dbus_pending_call_cancel(client->get_objects_call); + dbus_pending_call_unref(client->get_objects_call); + } + for (i = 0; i < client->match_rules->len; i++) { modify_match(client->dbus_conn, "RemoveMatch", g_ptr_array_index(client->match_rules, i)); |