* [PATCH BlueZ 01/10 v3] build: Fix not rebuilding bluetoothd if gdbus changes
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 02/10 v3] unit: Add gdbus/client_check_order Luiz Augusto von Dentz
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
src_bluetoothd_DEPENDENCIES should list all local libraries including gdbus
otherwise it does not get relinked whenever gdbus changes.
---
Makefile.am | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am
index 61daec4..4e4b1c5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -157,7 +157,7 @@ src_bluetoothd_LDFLAGS = $(AM_LDFLAGS) -Wl,--export-dynamic \
-Wl,--version-script=$(srcdir)/src/bluetooth.ver
src_bluetoothd_DEPENDENCIES = lib/libbluetooth-internal.la \
- src/bluetooth.service
+ gdbus/libgdbus-internal.la src/bluetooth.service
src_bluetoothd_CFLAGS = $(AM_CFLAGS) -DBLUETOOTH_PLUGIN_BUILTIN \
-DPLUGINDIR=\""$(build_plugindir)"\"
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH BlueZ 02/10 v3] unit: Add gdbus/client_check_order
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 01/10 v3] build: Fix not rebuilding bluetoothd if gdbus changes Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 03/10 v3] gdbus: Fix sending ObjectManager/Properties signals out of order Luiz Augusto von Dentz
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
unit/test-gdbus-client.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 71 insertions(+)
diff --git a/unit/test-gdbus-client.c b/unit/test-gdbus-client.c
index a594384..488d4ec 100644
--- a/unit/test-gdbus-client.c
+++ b/unit/test-gdbus-client.c
@@ -35,6 +35,7 @@ struct context {
GMainLoop *main_loop;
DBusConnection *dbus_conn;
GDBusClient *dbus_client;
+ GDBusProxy *proxy;
void *data;
guint timeout_source;
};
@@ -779,6 +780,74 @@ static void client_string_changed(void)
destroy_context(context);
}
+static void property_check_order(const DBusError *err, void *user_data)
+{
+ struct context *context = user_data;
+ GDBusProxy *proxy = context->proxy;
+ DBusMessageIter iter;
+ const char *string;
+
+ g_assert(!dbus_error_is_set(err));
+
+ g_assert(g_dbus_proxy_get_property(proxy, "String", &iter));
+
+ dbus_message_iter_get_basic(&iter, &string);
+ g_assert(g_strcmp0(string, "value1") == 0);
+
+ g_dbus_client_unref(context->dbus_client);
+}
+
+static void proxy_check_order(GDBusProxy *proxy, void *user_data)
+{
+ struct context *context = user_data;
+ const char *string;
+
+ if (g_test_verbose())
+ g_print("proxy %s found\n",
+ g_dbus_proxy_get_interface(proxy));
+
+ context->proxy = proxy;
+ string = "value1";
+ g_assert(g_dbus_proxy_set_property_basic(proxy, "String",
+ DBUS_TYPE_STRING, &string,
+ property_check_order, context,
+ NULL));
+}
+
+static void client_check_order(void)
+{
+ struct context *context = create_context();
+ static const GDBusPropertyTable string_properties[] = {
+ { "String", "s", get_string, set_string, string_exists },
+ { },
+ };
+
+ if (context == NULL)
+ return;
+
+ context->data = g_strdup("value");
+ g_dbus_register_interface(context->dbus_conn,
+ SERVICE_PATH, SERVICE_NAME,
+ methods, signals, string_properties,
+ context, NULL);
+
+ context->dbus_client = g_dbus_client_new(context->dbus_conn,
+ SERVICE_NAME, SERVICE_PATH);
+
+ g_dbus_client_set_disconnect_watch(context->dbus_client,
+ disconnect_handler, context);
+ g_dbus_client_set_proxy_handlers(context->dbus_client,
+ proxy_check_order, NULL, NULL,
+ context);
+
+ g_main_loop_run(context->main_loop);
+
+ g_dbus_unregister_interface(context->dbus_conn,
+ SERVICE_PATH, SERVICE_NAME);
+
+ destroy_context(context);
+}
+
int main(int argc, char *argv[])
{
g_test_init(&argc, &argv, NULL);
@@ -809,5 +878,7 @@ int main(int argc, char *argv[])
g_test_add_func("/gdbus/client_string_changed",
client_string_changed);
+ g_test_add_func("/gdbus/client_check_order", client_check_order);
+
return g_test_run();
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH BlueZ 03/10 v3] gdbus: Fix sending ObjectManager/Properties signals out of order
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 01/10 v3] build: Fix not rebuilding bluetoothd if gdbus changes Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 02/10 v3] unit: Add gdbus/client_check_order Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 04/10 v3] gdbus: Add g_dbus_send_message_with_reply Luiz Augusto von Dentz
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
In some cases the order of the messages is altered when a message is
sent without processing the pending signals first, currently this affect
client_check_order unit test:
/gdbus/client_check_order: **
ERROR:unit/test-gdbus-client.c:795:property_check_order: assertion failed: (g_strcmp0(string, "value1") == 0)
As can be observed the value of the property is not yet updated because the
signal it is still pending, once this fix is applied the test pass:
/gdbus/client_check_order: OK
Note that the flushing only works when g_dbus_send_message is used so
places where dbus_connection_send and other variants are called directly
may still change the order.
---
gdbus/object.c | 69 ++++++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 53 insertions(+), 16 deletions(-)
diff --git a/gdbus/object.c b/gdbus/object.c
index 2f8ef45..83fc4e6 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -86,6 +86,7 @@ struct property_data {
static int global_flags = 0;
static struct generic_data *root;
+static GSList *pending = NULL;
static gboolean process_changes(gpointer user_data);
static void process_properties_from_interface(struct generic_data *data,
@@ -599,7 +600,9 @@ static void emit_interfaces_added(struct generic_data *data)
dbus_message_iter_close_container(&iter, &array);
- g_dbus_send_message(data->conn, signal);
+ /* Use dbus_connection_send to avoid recursive calls to g_dbus_flush */
+ dbus_connection_send(data->conn, signal, NULL);
+ dbus_message_unref(signal);
}
static struct interface_data *find_interface(GSList *interfaces,
@@ -640,6 +643,16 @@ static gboolean g_dbus_args_have_signature(const GDBusArgInfo *args,
return TRUE;
}
+static void add_pending(struct generic_data *data)
+{
+ if (data->process_id > 0)
+ return;
+
+ data->process_id = g_idle_add(process_changes, data);
+
+ pending = g_slist_append(pending, data);
+}
+
static gboolean remove_interface(struct generic_data *data, const char *name)
{
struct interface_data *iface;
@@ -677,10 +690,7 @@ static gboolean remove_interface(struct generic_data *data, const char *name)
data->removed = g_slist_prepend(data->removed, iface->name);
g_free(iface);
- if (data->process_id > 0)
- return TRUE;
-
- data->process_id = g_idle_add(process_changes, data);
+ add_pending(data);
return TRUE;
}
@@ -976,14 +986,26 @@ static void emit_interfaces_removed(struct generic_data *data)
dbus_message_iter_close_container(&iter, &array);
- g_dbus_send_message(data->conn, signal);
+ /* Use dbus_connection_send to avoid recursive calls to g_dbus_flush */
+ dbus_connection_send(data->conn, signal, NULL);
+ dbus_message_unref(signal);
+}
+
+static void remove_pending(struct generic_data *data)
+{
+ if (data->process_id > 0) {
+ g_source_remove(data->process_id);
+ data->process_id = 0;
+ }
+
+ pending = g_slist_remove(pending, data);
}
static gboolean process_changes(gpointer user_data)
{
struct generic_data *data = user_data;
- data->process_id = 0;
+ remove_pending(data);
if (data->added != NULL)
emit_interfaces_added(data);
@@ -1211,10 +1233,8 @@ done:
return TRUE;
data->added = g_slist_append(data->added, iface);
- if (data->process_id > 0)
- return TRUE;
- data->process_id = g_idle_add(process_changes, data);
+ add_pending(data);
return TRUE;
}
@@ -1494,6 +1514,21 @@ DBusMessage *g_dbus_create_reply(DBusMessage *message, int type, ...)
return reply;
}
+static void g_dbus_flush(DBusConnection *connection)
+{
+ GSList *l;
+
+ for (l = pending; l;) {
+ struct generic_data *data = l->data;
+
+ l = l->next;
+ if (data->conn != connection)
+ continue;
+
+ process_changes(data);
+ }
+}
+
gboolean g_dbus_send_message(DBusConnection *connection, DBusMessage *message)
{
dbus_bool_t result = FALSE;
@@ -1510,6 +1545,9 @@ gboolean g_dbus_send_message(DBusConnection *connection, DBusMessage *message)
goto out;
}
+ /* Flush pending signal to guarantee message order */
+ g_dbus_flush(connection);
+
result = dbus_connection_send(connection, message, NULL);
out:
@@ -1664,10 +1702,12 @@ static void process_properties_from_interface(struct generic_data *data,
g_slist_free(invalidated);
dbus_message_iter_close_container(&iter, &array);
- g_dbus_send_message(data->conn, signal);
-
g_slist_free(iface->pending_prop);
iface->pending_prop = NULL;
+
+ /* Use dbus_connection_send to avoid recursive calls to g_dbus_flush */
+ dbus_connection_send(data->conn, signal, NULL);
+ dbus_message_unref(signal);
}
static void process_property_changes(struct generic_data *data)
@@ -1723,10 +1763,7 @@ void g_dbus_emit_property_changed(DBusConnection *connection,
iface->pending_prop = g_slist_prepend(iface->pending_prop,
(void *) property);
- if (!data->process_id) {
- data->process_id = g_idle_add(process_changes, data);
- return;
- }
+ add_pending(data);
}
gboolean g_dbus_get_properties(DBusConnection *connection, const char *path,
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH BlueZ 04/10 v3] gdbus: Add g_dbus_send_message_with_reply
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
` (2 preceding siblings ...)
2013-09-03 11:21 ` [PATCH BlueZ 03/10 v3] gdbus: Fix sending ObjectManager/Properties signals out of order Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 05/10 v3] gdbus: Avoid calling dbus_connection_send* Luiz Augusto von Dentz
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
g_dbus_send_message_with_reply flushes pending signals before calling
dbus_connection_send_with_reply so it does not alter the message order
---
gdbus/gdbus.h | 3 +++
gdbus/object.c | 11 +++++++++++
2 files changed, 14 insertions(+)
diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h
index 8b13393..9542109 100644
--- a/gdbus/gdbus.h
+++ b/gdbus/gdbus.h
@@ -250,6 +250,9 @@ DBusMessage *g_dbus_create_reply_valist(DBusMessage *message,
int type, va_list args);
gboolean g_dbus_send_message(DBusConnection *connection, DBusMessage *message);
+gboolean g_dbus_send_message_with_reply(DBusConnection *connection,
+ DBusMessage *message,
+ DBusPendingCall **call, int timeout);
gboolean g_dbus_send_error(DBusConnection *connection, DBusMessage *message,
const char *name, const char *format, ...)
__attribute__((format(printf, 4, 5)));
diff --git a/gdbus/object.c b/gdbus/object.c
index 83fc4e6..773128c 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -1556,6 +1556,17 @@ out:
return result;
}
+gboolean g_dbus_send_message_with_reply(DBusConnection *connection,
+ DBusMessage *message,
+ DBusPendingCall **call, int timeout)
+{
+ /* Flush pending signal to guarantee message order */
+ g_dbus_flush(connection);
+
+ return dbus_connection_send_with_reply(connection, message, call,
+ timeout);
+}
+
gboolean g_dbus_send_error_valist(DBusConnection *connection,
DBusMessage *message, const char *name,
const char *format, va_list args)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH BlueZ 05/10 v3] gdbus: Avoid calling dbus_connection_send*
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
` (3 preceding siblings ...)
2013-09-03 11:21 ` [PATCH BlueZ 04/10 v3] gdbus: Add g_dbus_send_message_with_reply Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 06/10 v3] gdbus: Fix emitting PropertiesChanged twice Luiz Augusto von Dentz
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
dbus_connection_send* should not be called directly except by
g_dbus_send_message.
---
gdbus/client.c | 14 ++++-----
gdbus/object.c | 92 ++++++++++++++++++++++------------------------------------
2 files changed, 42 insertions(+), 64 deletions(-)
diff --git a/gdbus/client.c b/gdbus/client.c
index d80e252..8ebfaad 100644
--- a/gdbus/client.c
+++ b/gdbus/client.c
@@ -100,7 +100,7 @@ static gboolean modify_match(DBusConnection *conn, const char *member,
dbus_message_append_args(msg, DBUS_TYPE_STRING, &rule,
DBUS_TYPE_INVALID);
- if (dbus_connection_send_with_reply(conn, msg, &call, -1) == FALSE) {
+ if (g_dbus_send_message_with_reply(conn, msg, &call, -1) == FALSE) {
dbus_message_unref(msg);
return FALSE;
}
@@ -319,7 +319,7 @@ static void get_all_properties(GDBusProxy *proxy)
dbus_message_append_args(msg, DBUS_TYPE_STRING, &proxy->interface,
DBUS_TYPE_INVALID);
- if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+ if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
&call, -1) == FALSE) {
dbus_message_unref(msg);
return;
@@ -575,7 +575,7 @@ gboolean g_dbus_proxy_refresh_property(GDBusProxy *proxy, const char *name)
&proxy->interface);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
- if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+ if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
&call, -1) == FALSE) {
dbus_message_unref(msg);
refresh_property_free(data);
@@ -668,7 +668,7 @@ gboolean g_dbus_proxy_set_property_basic(GDBusProxy *proxy,
dbus_message_iter_append_basic(&variant, type, value);
dbus_message_iter_close_container(&iter, &variant);
- if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+ if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
&call, -1) == FALSE) {
dbus_message_unref(msg);
g_free(data);
@@ -742,7 +742,7 @@ gboolean g_dbus_proxy_method_call(GDBusProxy *proxy, const char *method,
setup(&iter, data->user_data);
}
- if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+ if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
&call, METHOD_CALL_TIMEOUT) == FALSE) {
dbus_message_unref(msg);
g_free(data);
@@ -1038,7 +1038,7 @@ 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,
+ if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
&client->get_objects_call, -1) == FALSE) {
dbus_message_unref(msg);
return;
@@ -1102,7 +1102,7 @@ static void get_name_owner(GDBusClient *client, const char *name)
dbus_message_append_args(msg, DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID);
- if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+ if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
&client->pending_call, -1) == FALSE) {
dbus_message_unref(msg);
return;
diff --git a/gdbus/object.c b/gdbus/object.c
index 773128c..c4cf724 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -272,8 +272,7 @@ static DBusHandlerResult process_message(DBusConnection *connection,
if (reply == NULL)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
- dbus_connection_send(connection, reply, NULL);
- dbus_message_unref(reply);
+ g_dbus_send_message(connection, reply);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -313,19 +312,14 @@ void g_dbus_pending_error_valist(DBusConnection *connection,
for (list = pending_security; list; list = list->next) {
struct security_data *secdata = list->data;
- DBusMessage *reply;
if (secdata->pending != pending)
continue;
pending_security = g_slist_remove(pending_security, secdata);
- reply = g_dbus_create_error_valist(secdata->message,
+ g_dbus_send_error_valist(connection, secdata->message,
name, format, args);
- if (reply != NULL) {
- dbus_connection_send(connection, reply, NULL);
- dbus_message_unref(reply);
- }
dbus_message_unref(secdata->message);
g_free(secdata);
@@ -470,18 +464,13 @@ void g_dbus_pending_property_error_valist(GDBusPendingReply id,
va_list args)
{
struct property_data *propdata;
- DBusMessage *reply;
propdata = remove_pending_property_data(id);
if (propdata == NULL)
return;
- reply = g_dbus_create_error_valist(propdata->message, name, format,
- args);
- if (reply != NULL) {
- dbus_connection_send(propdata->conn, reply, NULL);
- dbus_message_unref(reply);
- }
+ g_dbus_send_error_valist(propdata->conn, propdata->message, name,
+ format, args);
dbus_message_unref(propdata->message);
g_free(propdata);
@@ -1339,45 +1328,6 @@ static gboolean check_signal(DBusConnection *conn, const char *path,
return FALSE;
}
-static dbus_bool_t emit_signal_valist(DBusConnection *conn,
- const char *path,
- const char *interface,
- const char *name,
- int first,
- va_list var_args)
-{
- DBusMessage *signal;
- dbus_bool_t ret;
- const GDBusArgInfo *args;
-
- if (!check_signal(conn, path, interface, name, &args))
- return FALSE;
-
- signal = dbus_message_new_signal(path, interface, name);
- if (signal == NULL) {
- error("Unable to allocate new %s.%s signal", interface, name);
- return FALSE;
- }
-
- ret = dbus_message_append_args_valist(signal, first, var_args);
- if (!ret)
- goto fail;
-
- if (g_dbus_args_have_signature(args, signal) == FALSE) {
- error("%s.%s: got unexpected signature '%s'", interface, name,
- dbus_message_get_signature(signal));
- ret = FALSE;
- goto fail;
- }
-
- ret = dbus_connection_send(conn, signal, NULL);
-
-fail:
- dbus_message_unref(signal);
-
- return ret;
-}
-
gboolean g_dbus_register_interface(DBusConnection *connection,
const char *path, const char *name,
const GDBusMethodTable *methods,
@@ -1640,7 +1590,7 @@ gboolean g_dbus_emit_signal(DBusConnection *connection,
va_start(args, type);
- result = emit_signal_valist(connection, path, interface,
+ result = g_dbus_emit_signal_valist(connection, path, interface,
name, type, args);
va_end(args);
@@ -1652,8 +1602,36 @@ gboolean g_dbus_emit_signal_valist(DBusConnection *connection,
const char *path, const char *interface,
const char *name, int type, va_list args)
{
- return emit_signal_valist(connection, path, interface,
- name, type, args);
+ DBusMessage *signal;
+ dbus_bool_t ret;
+ const GDBusArgInfo *args_info;
+
+ if (!check_signal(connection, path, interface, name, &args_info))
+ return FALSE;
+
+ signal = dbus_message_new_signal(path, interface, name);
+ if (signal == NULL) {
+ error("Unable to allocate new %s.%s signal", interface, name);
+ return FALSE;
+ }
+
+ ret = dbus_message_append_args_valist(signal, type, args);
+ if (!ret)
+ goto fail;
+
+ if (g_dbus_args_have_signature(args_info, signal) == FALSE) {
+ error("%s.%s: got unexpected signature '%s'", interface, name,
+ dbus_message_get_signature(signal));
+ ret = FALSE;
+ goto fail;
+ }
+
+ return g_dbus_send_message(connection, signal);
+
+fail:
+ dbus_message_unref(signal);
+
+ return ret;
}
static void process_properties_from_interface(struct generic_data *data,
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH BlueZ 06/10 v3] gdbus: Fix emitting PropertiesChanged twice
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
` (4 preceding siblings ...)
2013-09-03 11:21 ` [PATCH BlueZ 05/10 v3] gdbus: Avoid calling dbus_connection_send* Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 07/10 v3] core: Make use of g_dbus_send_message_with_reply Luiz Augusto von Dentz
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This fixes double emission of PropertiesChanged introduced by flushing
changes, the flushing can happen during the pending processing so the
pending_prop flag needs to be updated in the beginning and the list of
properties can be freed before g_dbus_send_message as it is not required
anymore.
---
gdbus/object.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/gdbus/object.c b/gdbus/object.c
index c4cf724..0822fe8 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -1642,6 +1642,8 @@ static void process_properties_from_interface(struct generic_data *data,
DBusMessageIter iter, dict, array;
GSList *invalidated;
+ data->pending_prop = FALSE;
+
if (iface->pending_prop == NULL)
return;
@@ -1708,8 +1710,6 @@ static void process_property_changes(struct generic_data *data)
process_properties_from_interface(data, iface);
}
-
- data->pending_prop = FALSE;
}
void g_dbus_emit_property_changed(DBusConnection *connection,
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH BlueZ 07/10 v3] core: Make use of g_dbus_send_message_with_reply
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
` (5 preceding siblings ...)
2013-09-03 11:21 ` [PATCH BlueZ 06/10 v3] gdbus: Fix emitting PropertiesChanged twice Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 08/10 v3] neard: " Luiz Augusto von Dentz
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This replaces dbus_connection_send_with_reply with
g_dbus_send_message_with_reply which does not alter message order.
---
src/agent.c | 12 ++++++------
src/profile.c | 4 ++--
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/agent.c b/src/agent.c
index b9e6e8c..7880ba6 100644
--- a/src/agent.c
+++ b/src/agent.c
@@ -370,7 +370,7 @@ static int agent_call_authorize_service(struct agent_request *req,
DBUS_TYPE_STRING, &uuid,
DBUS_TYPE_INVALID);
- if (dbus_connection_send_with_reply(btd_get_dbus_connection(),
+ if (g_dbus_send_message_with_reply(btd_get_dbus_connection(),
req->msg, &req->call,
REQUEST_TIMEOUT) == FALSE) {
error("D-Bus send failed");
@@ -480,7 +480,7 @@ static int pincode_request_new(struct agent_request *req, const char *device_pat
dbus_message_append_args(req->msg, DBUS_TYPE_OBJECT_PATH, &device_path,
DBUS_TYPE_INVALID);
- if (dbus_connection_send_with_reply(btd_get_dbus_connection(), req->msg,
+ if (g_dbus_send_message_with_reply(btd_get_dbus_connection(), req->msg,
&req->call, REQUEST_TIMEOUT) == FALSE) {
error("D-Bus send failed");
return -EIO;
@@ -574,7 +574,7 @@ static int passkey_request_new(struct agent_request *req,
dbus_message_append_args(req->msg, DBUS_TYPE_OBJECT_PATH, &device_path,
DBUS_TYPE_INVALID);
- if (dbus_connection_send_with_reply(btd_get_dbus_connection(), req->msg,
+ if (g_dbus_send_message_with_reply(btd_get_dbus_connection(), req->msg,
&req->call, REQUEST_TIMEOUT) == FALSE) {
error("D-Bus send failed");
return -EIO;
@@ -632,7 +632,7 @@ static int confirmation_request_new(struct agent_request *req,
DBUS_TYPE_UINT32, &passkey,
DBUS_TYPE_INVALID);
- if (dbus_connection_send_with_reply(btd_get_dbus_connection(), req->msg,
+ if (g_dbus_send_message_with_reply(btd_get_dbus_connection(), req->msg,
&req->call, REQUEST_TIMEOUT) == FALSE) {
error("D-Bus send failed");
return -EIO;
@@ -689,7 +689,7 @@ static int authorization_request_new(struct agent_request *req,
DBUS_TYPE_OBJECT_PATH, &device_path,
DBUS_TYPE_INVALID);
- if (dbus_connection_send_with_reply(btd_get_dbus_connection(), req->msg,
+ if (g_dbus_send_message_with_reply(btd_get_dbus_connection(), req->msg,
&req->call, REQUEST_TIMEOUT) == FALSE) {
error("D-Bus send failed");
return -EIO;
@@ -823,7 +823,7 @@ static int display_pincode_request_new(struct agent_request *req,
DBUS_TYPE_STRING, &pincode,
DBUS_TYPE_INVALID);
- if (dbus_connection_send_with_reply(btd_get_dbus_connection(), req->msg,
+ if (g_dbus_send_message_with_reply(btd_get_dbus_connection(), req->msg,
&req->call, REQUEST_TIMEOUT) == FALSE) {
error("D-Bus send failed");
return -EIO;
diff --git a/src/profile.c b/src/profile.c
index 90c3535..57aead7 100644
--- a/src/profile.c
+++ b/src/profile.c
@@ -938,7 +938,7 @@ static bool send_new_connection(struct ext_profile *ext, struct ext_io *conn)
dbus_message_iter_close_container(&iter, &dict);
- if (!dbus_connection_send_with_reply(btd_get_dbus_connection(),
+ if (!g_dbus_send_message_with_reply(btd_get_dbus_connection(),
msg, &conn->pending, -1)) {
error("%s: sending NewConnection failed", ext->name);
dbus_message_unref(msg);
@@ -1682,7 +1682,7 @@ static int send_disconn_req(struct ext_profile *ext, struct ext_io *conn)
dbus_message_append_args(msg, DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID);
- if (!dbus_connection_send_with_reply(btd_get_dbus_connection(),
+ if (!g_dbus_send_message_with_reply(btd_get_dbus_connection(),
msg, &conn->pending, -1)) {
error("%s: sending RequestDisconnection failed", ext->name);
dbus_message_unref(msg);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH BlueZ 08/10 v3] neard: Make use of g_dbus_send_message_with_reply
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
` (6 preceding siblings ...)
2013-09-03 11:21 ` [PATCH BlueZ 07/10 v3] core: Make use of g_dbus_send_message_with_reply Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 09/10 v3] audio/media: " Luiz Augusto von Dentz
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This replaces dbus_connection_send_with_reply with
g_dbus_send_message_with_reply which does not alter message order.
---
plugins/neard.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/neard.c b/plugins/neard.c
index e4a4d71..ea91c4d 100644
--- a/plugins/neard.c
+++ b/plugins/neard.c
@@ -158,7 +158,7 @@ static void register_agent(bool append_carrier)
dbus_message_append_args(message, DBUS_TYPE_STRING, &carrier,
DBUS_TYPE_INVALID);
- if (!dbus_connection_send_with_reply(btd_get_dbus_connection(),
+ if (!g_dbus_send_message_with_reply(btd_get_dbus_connection(),
message, &call, -1)) {
dbus_message_unref(message);
error("D-Bus send failed");
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH BlueZ 09/10 v3] audio/media: Make use of g_dbus_send_message_with_reply
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
` (7 preceding siblings ...)
2013-09-03 11:21 ` [PATCH BlueZ 08/10 v3] neard: " Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-03 11:21 ` [PATCH BlueZ 10/10 v3] obexd: Make use of g_dbus_send_message* Luiz Augusto von Dentz
2013-09-09 14:40 ` [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This replaces dbus_connection_send_with_reply with
g_dbus_send_message_with_reply which does not alter message order.
---
profiles/audio/media.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/profiles/audio/media.c b/profiles/audio/media.c
index 5a06b99..9c72b8d 100644
--- a/profiles/audio/media.c
+++ b/profiles/audio/media.c
@@ -325,7 +325,7 @@ static gboolean media_endpoint_async_call(DBusMessage *msg,
request = g_new0(struct endpoint_request, 1);
/* Timeout should be less than avdtp request timeout (4 seconds) */
- if (dbus_connection_send_with_reply(btd_get_dbus_connection(),
+ if (g_dbus_send_message_with_reply(btd_get_dbus_connection(),
msg, &request->call,
REQUEST_TIMEOUT) == FALSE) {
error("D-Bus send failed");
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH BlueZ 10/10 v3] obexd: Make use of g_dbus_send_message*
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
` (8 preceding siblings ...)
2013-09-03 11:21 ` [PATCH BlueZ 09/10 v3] audio/media: " Luiz Augusto von Dentz
@ 2013-09-03 11:21 ` Luiz Augusto von Dentz
2013-09-09 14:40 ` [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-03 11:21 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This replaces dbus_connection_send* with g_dbus_send_message* which do
not alter message order.
---
obexd/plugins/bluetooth.c | 2 +-
obexd/plugins/pcsuite.c | 5 ++---
obexd/plugins/syncevolution.c | 6 +++---
obexd/src/manager.c | 3 +--
4 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/obexd/plugins/bluetooth.c b/obexd/plugins/bluetooth.c
index e4d518e..10f5e4f 100644
--- a/obexd/plugins/bluetooth.c
+++ b/obexd/plugins/bluetooth.c
@@ -317,7 +317,7 @@ static int register_profile(struct bluetooth_profile *profile)
}
dbus_message_iter_close_container(&iter, &opt);
- if (!dbus_connection_send_with_reply(connection, msg, &call, -1)) {
+ if (!g_dbus_send_message_with_reply(connection, msg, &call, -1)) {
ret = -1;
unregister_profile(profile);
goto failed;
diff --git a/obexd/plugins/pcsuite.c b/obexd/plugins/pcsuite.c
index 4ce2fe4..6460aa9 100644
--- a/obexd/plugins/pcsuite.c
+++ b/obexd/plugins/pcsuite.c
@@ -351,7 +351,7 @@ static gboolean send_backup_dbus_message(const char *oper,
DBUS_TYPE_INVALID);
if (strcmp(oper, "open") == 0) {
- ret = dbus_connection_send_with_reply(conn, msg, &pending_call,
+ ret = g_dbus_send_message_with_reply(conn, msg, &pending_call,
BACKUP_DBUS_TIMEOUT);
dbus_message_unref(msg);
if (ret) {
@@ -363,8 +363,7 @@ static gboolean send_backup_dbus_message(const char *oper,
} else
dbus_connection_unref(conn);
} else {
- ret = dbus_connection_send(conn, msg, NULL);
- dbus_message_unref(msg);
+ g_dbus_send_message(conn, msg);
dbus_connection_unref(conn);
}
diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c
index 2d25d28..edc00c8 100644
--- a/obexd/plugins/syncevolution.c
+++ b/obexd/plugins/syncevolution.c
@@ -314,7 +314,7 @@ static int synce_close(void *object)
dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &normal,
DBUS_TYPE_STRING, &error, DBUS_TYPE_INVALID);
- dbus_connection_send_with_reply(context->dbus_conn, msg, &call, -1);
+ g_dbus_send_message_with_reply(context->dbus_conn, msg, &call, -1);
dbus_pending_call_set_notify(call, close_cb, NULL, NULL);
dbus_message_unref(msg);
dbus_pending_call_unref(call);
@@ -380,7 +380,7 @@ static ssize_t synce_read(void *object, void *buf, size_t count)
dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &authenticate,
DBUS_TYPE_STRING, &session, DBUS_TYPE_INVALID);
- if (!dbus_connection_send_with_reply(conn, msg, &call, -1)) {
+ if (!g_dbus_send_message_with_reply(conn, msg, &call, -1)) {
error("D-Bus call to %s failed.", SYNCE_SERVER_INTERFACE);
dbus_message_unref(msg);
return -EPERM;
@@ -424,7 +424,7 @@ static ssize_t synce_write(void *object, const void *buf, size_t count)
dbus_message_append_args(msg, DBUS_TYPE_STRING, &type,
DBUS_TYPE_INVALID);
- if (!dbus_connection_send_with_reply(context->dbus_conn, msg,
+ if (!g_dbus_send_message_with_reply(context->dbus_conn, msg,
&call, -1)) {
error("D-Bus call to %s failed.", SYNCE_CONN_INTERFACE);
dbus_message_unref(msg);
diff --git a/obexd/src/manager.c b/obexd/src/manager.c
index dbfbef8..f64b7b9 100644
--- a/obexd/src/manager.c
+++ b/obexd/src/manager.c
@@ -776,8 +776,7 @@ int manager_request_authorization(struct obex_transfer *transfer, int32_t time,
dbus_message_append_args(msg, DBUS_TYPE_OBJECT_PATH, &transfer->path,
DBUS_TYPE_INVALID);
- if (!dbus_connection_send_with_reply(connection,
- msg, &call, TIMEOUT)) {
+ if (!g_dbus_send_message_with_reply(connection, msg, &call, TIMEOUT)) {
dbus_message_unref(msg);
return -EPERM;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH BlueZ 00/10 v3] Fix message order
2013-09-03 11:21 [PATCH BlueZ 00/10 v3] Fix message order Luiz Augusto von Dentz
` (9 preceding siblings ...)
2013-09-03 11:21 ` [PATCH BlueZ 10/10 v3] obexd: Make use of g_dbus_send_message* Luiz Augusto von Dentz
@ 2013-09-09 14:40 ` Luiz Augusto von Dentz
10 siblings, 0 replies; 12+ messages in thread
From: Luiz Augusto von Dentz @ 2013-09-09 14:40 UTC (permalink / raw)
To: linux-bluetooth@vger.kernel.org
Hi,
On Tue, Sep 3, 2013 at 2:21 PM, Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> s set fixes a couple of issues introduced with the use of ObjectManager due
> the processing of signals on idle to group changes, this has been causing
> issues with external components such as ofono and pulseaudio that sometimes
> receives connections from devices objects that have pending signals thus
> cannot be properly processed or have to be assumed paired and with certain
> UUIDs which is not ideal.
>
> v2: Fixes some commit messages as suggested by Lucas Demarchi, in addition to
> that rework flush mechanism to honor the order of the pending signals and make
> it work with any connection.
>
> v3: Add comments regarding the use of dbus_connection_send to prevent recursive
> calls to g_dbus_flush.
>
> Luiz Augusto von Dentz (10):
> build: Fix not rebuilding bluetoothd if gdbus changes
> unit: Add gdbus/client_check_order
> gdbus: Fix sending ObjectManager/Properties signals out of order
> gdbus: Add g_dbus_send_message_with_reply
> gdbus: Avoid calling dbus_connection_send*
> gdbus: Fix emitting PropertiesChanged twice
> core: Make use of g_dbus_send_message_with_reply
> neard: Make use of g_dbus_send_message_with_reply
> audio/media: Make use of g_dbus_send_message_with_reply
> obexd: Make use of g_dbus_send_message*
>
> Makefile.am | 2 +-
> gdbus/client.c | 14 ++--
> gdbus/gdbus.h | 3 +
> gdbus/object.c | 176 ++++++++++++++++++++++++------------------
> obexd/plugins/bluetooth.c | 2 +-
> obexd/plugins/pcsuite.c | 5 +-
> obexd/plugins/syncevolution.c | 6 +-
> obexd/src/manager.c | 3 +-
> plugins/neard.c | 2 +-
> profiles/audio/media.c | 2 +-
> src/agent.c | 12 +--
> src/profile.c | 4 +-
> unit/test-gdbus-client.c | 71 +++++++++++++++++
> 13 files changed, 200 insertions(+), 102 deletions(-)
>
> --
> 1.8.3.1
I went ahead and pushed this upstream.
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 12+ messages in thread