diff --git a/src/gatt-database.c b/src/gatt-database.c
index be6dfb2..8cf60c5 100644
--- a/src/gatt-database.c
+++ b/src/gatt-database.c
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;
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)
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);