summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNishant Chaprana <n.chaprana@samsung.com>2021-09-24 18:35:37 +0530
committerNishant Chaprana <n.chaprana@samsung.com>2021-09-24 18:35:37 +0530
commitf99d5c1915b4f361421f36c77643595497c61473 (patch)
tree83a046f9a1b9f7539a18626957d5ead896d5ec72
parent7e5e845e5fd4665b1a75985b198f727872937efb (diff)
downloadconnman-f99d5c1915b4f361421f36c77643595497c61473.tar.gz
connman-f99d5c1915b4f361421f36c77643595497c61473.tar.bz2
connman-f99d5c1915b4f361421f36c77643595497c61473.zip
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 <n.chaprana@samsung.com>
-rwxr-xr-xsrc/device.c63
1 files changed, 46 insertions, 17 deletions
diff --git a/src/device.c b/src/device.c
index d0825ce2..377ef47e 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,