From: Nishant Chaprana Date: Fri, 24 Sep 2021 13:05:37 +0000 (+0530) Subject: Reply all multiple/simultaenous SetDevicePower method call X-Git-Tag: accepted/tizen/6.5/unified/20211028.225128^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F75%2F264575%2F1;p=platform%2Fupstream%2Fconnman.git Reply all multiple/simultaenous SetDevicePower method call This patch fixes an issue where Multiple/Simultaenous SetDevicePower method calls are made and reply is sent to only last dbus caller. Change-Id: I61e1f5e5b8645dee41910a1b6ea51a405e6024a4 Signed-off-by: Nishant Chaprana --- diff --git a/src/device.c b/src/device.c index d0825ce..377ef47 100755 --- a/src/device.c +++ b/src/device.c @@ -76,7 +76,10 @@ struct connman_device { time_t last_user_selection_time; char *last_user_selection_ident; char *last_connected_ident; - DBusMessage *pending_reply; + GList *pending_reply_list; /* List of DBusMessage* for async reply to multiple + * device power dbus calls, which are made before + * connman_device_set_powered(). + */ int max_scan_ssids; bool is_5_0_ghz_supported; unsigned int mac_policy; @@ -85,12 +88,21 @@ struct connman_device { #endif }; +#if defined TIZEN_EXT +static void __clear_pending_trigger(gpointer data, gpointer user_data) +{ + DBusMessage *msg = (DBusMessage *)data; + dbus_message_unref(msg); +} +#endif + static void clear_pending_trigger(struct connman_device *device) { #if defined TIZEN_EXT - if (device->pending_reply) { - dbus_message_unref(device->pending_reply); - device->pending_reply = NULL; + if (device->pending_reply_list) { + g_list_foreach(device->pending_reply_list, __clear_pending_trigger, NULL); + g_list_free(device->pending_reply_list); + device->pending_reply_list = NULL; } #endif if (device->pending_timeout > 0) { @@ -200,6 +212,20 @@ static bool device_has_service_type(struct connman_device *device, return service_type == device_service_type; } +#if defined TIZEN_EXT +static void __device_pending_reset(gpointer data, gpointer user_data) +{ + DBusMessage *msg = (DBusMessage *)data; + DBusMessage *reply; + + reply = __connman_error_failed(msg, ETIMEDOUT); + if (reply) + g_dbus_send_message(connection, reply); + + dbus_message_unref(msg); +} +#endif + static gboolean device_pending_reset(gpointer user_data) { struct connman_device *device = user_data; @@ -210,13 +236,10 @@ static gboolean device_pending_reset(gpointer user_data) DBusMessage *reply; /* Power request timed out, send ETIMEDOUT. */ - if (device->pending_reply) { - reply = __connman_error_failed(device->pending_reply, ETIMEDOUT); - if (reply) - g_dbus_send_message(connection, reply); - - dbus_message_unref(device->pending_reply); - device->pending_reply = NULL; + if (device->pending_reply_list) { + g_list_foreach(device->pending_reply_list, __device_pending_reset, NULL); + g_list_free(device->pending_reply_list); + device->pending_reply_list = NULL; } #endif /* Power request timedout, reset power pending state. */ @@ -506,13 +529,19 @@ static void device_send_changed(const char *ifname, enum connman_service_type ty dbus_message_unref(signal); } +static void __device_send_reply(gpointer data, gpointer user_data) +{ + DBusMessage *msg = (DBusMessage *)data; + g_dbus_send_reply(connection, msg, DBUS_TYPE_INVALID); + dbus_message_unref(msg); +} + static void device_send_reply(struct connman_device *device) { - if (device->pending_reply) { - g_dbus_send_reply(connection, - device->pending_reply, DBUS_TYPE_INVALID); - dbus_message_unref(device->pending_reply); - device->pending_reply = NULL; + if (device->pending_reply_list) { + g_list_foreach(device->pending_reply_list, __device_send_reply, NULL); + g_list_free(device->pending_reply_list); + device->pending_reply_list = NULL; } } #endif @@ -1220,7 +1249,7 @@ struct connman_network *connman_device_get_default_network( void connman_device_set_pending_reply(struct connman_device *device, DBusMessage *msg) { - device->pending_reply = dbus_message_ref(msg); + device->pending_reply_list = g_list_prepend(device->pending_reply_list, dbus_message_ref(msg)); } void connman_device_send_connected_signal(struct connman_device *device,