summaryrefslogtreecommitdiff
path: root/mesh/dbus.c
diff options
context:
space:
mode:
authorBrian Gix <brian.gix@intel.com>2020-04-14 10:55:57 +0200
committerBrian Gix <brian.gix@intel.com>2020-04-14 08:45:47 -0700
commit8a73c868b79bdf589a1b396e83beb457f5ba5ff0 (patch)
tree8721d1e5e72ccdc08bef314587e9b150e496f877 /mesh/dbus.c
parentfda1a55799fc6b1042f64c934e40985dc836ba36 (diff)
downloadbluez-8a73c868b79bdf589a1b396e83beb457f5ba5ff0.tar.gz
mesh: Add Time-outs to critical dbus send-with-replies
JoinComplete() dbus method calls are the only time that node tokens are delivered to client Applications, so if the call fails for any reason (including time-outs) the daemon has a way to clean-up the stale unused node data.
Diffstat (limited to 'mesh/dbus.c')
-rw-r--r--mesh/dbus.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/mesh/dbus.c b/mesh/dbus.c
index 6b9694ab7..bf0f73bd9 100644
--- a/mesh/dbus.c
+++ b/mesh/dbus.c
@@ -37,6 +37,14 @@ struct error_entry {
const char *default_desc;
};
+struct send_info {
+ struct l_dbus *dbus;
+ struct l_timeout *timeout;
+ l_dbus_message_func_t cb;
+ void *user_data;
+ uint32_t serial;
+};
+
/*
* Important: The entries in this table follow the order of
* enumerated values in mesh_error (file error.h)
@@ -143,3 +151,35 @@ void dbus_append_dict_entry_basic(struct l_dbus_message_builder *builder,
l_dbus_message_builder_leave_variant(builder);
l_dbus_message_builder_leave_dict(builder);
}
+
+static void send_reply(struct l_dbus_message *message, void *user_data)
+{
+ struct send_info *info = user_data;
+
+ l_timeout_remove(info->timeout);
+ info->cb(message, info->user_data);
+ l_free(info);
+}
+
+static void send_timeout(struct l_timeout *timeout, void *user_data)
+{
+ struct send_info *info = user_data;
+
+ l_dbus_cancel(info->dbus, info->serial);
+ send_reply(NULL, info);
+}
+
+void dbus_send_with_timeout(struct l_dbus *dbus, struct l_dbus_message *msg,
+ l_dbus_message_func_t cb,
+ void *user_data,
+ unsigned int seconds)
+{
+ struct send_info *info = l_new(struct send_info, 1);
+
+ info->dbus = dbus;
+ info->cb = cb;
+ info->user_data = user_data;
+ info->serial = l_dbus_send_with_reply(dbus, msg, send_reply,
+ info, NULL);
+ info->timeout = l_timeout_create(seconds, send_timeout, info, NULL);
+}