Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP3:Update
bluez
gatt-database-No-multiple-calls-to-AcquireWrite...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File gatt-database-No-multiple-calls-to-AcquireWrite.patch of Package bluez
From 6278a71040ef070f2a15e07a43b449ce5035287a Mon Sep 17 00:00:00 2001 From: Sebastian Urban <surban@surban.net> Date: Sat, 12 Jun 2021 11:56:01 +0200 Subject: [PATCH] gatt-database: No multiple calls to AcquireWrite This checks if an outstanding call to AcquireWrite is already in progress. If so, the write request is placed into the queue, but AcquireWrite is not called again. When a response to AcquireWrite is received, acquire_write_reply sends all queued writes over the acquired socket. Making multiple simultaneous calls to AcquireWrite makes no sense, as this would open multiple socket pairs and only the last returned socket would be used for further writes. --- src/gatt-database.c | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) Index: bluez-5.55/src/gatt-database.c =================================================================== --- bluez-5.55.orig/src/gatt-database.c +++ bluez-5.55/src/gatt-database.c @@ -2382,6 +2382,26 @@ static struct pending_op *send_write(str return NULL; } +static void flush_pending_write(void *data, void *user_data) +{ + GDBusProxy *proxy = user_data; + struct pending_op *op = data; + + if (g_dbus_proxy_method_call(proxy, "WriteValue", write_setup_cb, + write_reply_cb, + op, pending_op_free) == TRUE) + return; + + pending_op_free(op); +} + +static void flush_pending_writes(GDBusProxy *proxy, + struct queue *owner_queue) +{ + queue_foreach(owner_queue, flush_pending_write, proxy); + queue_remove_all(owner_queue, NULL, NULL, NULL); +} + static bool sock_hup(struct io *io, void *user_data) { struct external_chrc *chrc = user_data; @@ -2492,18 +2512,19 @@ static void acquire_write_reply(DBusMess chrc->write_io = sock_io_new(fd, chrc); - if (sock_io_send(chrc->write_io, op->data.iov_base, - op->data.iov_len) < 0) - goto retry; + while ((op = queue_peek_head(chrc->pending_writes)) != NULL) { + if (sock_io_send(chrc->write_io, op->data.iov_base, + op->data.iov_len) < 0) + goto retry; - gatt_db_attribute_write_result(op->attrib, op->id, 0); + gatt_db_attribute_write_result(op->attrib, op->id, 0); + pending_op_free(op); + } return; retry: - send_write(op->device, op->attrib, chrc->proxy, NULL, op->id, - op->data.iov_base, op->data.iov_len, 0, - op->link_type, false, false); + flush_pending_writes(chrc->proxy, chrc->pending_writes); } static void acquire_write_setup(DBusMessageIter *iter, void *user_data) @@ -2531,14 +2552,18 @@ static struct pending_op *acquire_write( uint8_t link_type) { struct pending_op *op; + bool acquiring = !queue_isempty(chrc->pending_writes); op = pending_write_new(device, chrc->pending_writes, attrib, id, value, len, 0, link_type, false, false); + if (acquiring) + return op; + if (g_dbus_proxy_method_call(chrc->proxy, "AcquireWrite", acquire_write_setup, acquire_write_reply, - op, pending_op_free)) + op, NULL)) return op; pending_op_free(op);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor