diff --git a/src/attrib-server.c b/src/attrib-server.c
index 93a7b4f..5137bdc 100644
--- a/src/attrib-server.c
+++ b/src/attrib-server.c
guint id;
gboolean encrypted;
struct gatt_server *server;
+ guint cleanup_id;
};
struct group_elem {
static void channel_free(struct gatt_channel *channel)
{
- g_attrib_unref(channel->attrib);
+ if (channel->cleanup_id)
+ g_source_remove(channel->cleanup_id);
+
+ g_attrib_unref(channel->attrib);
g_free(channel);
}
return enc_mtu_resp(old_mtu, pdu, len);
}
-static void channel_disconnect(void *user_data)
+static void channel_remove(struct gatt_channel *channel)
{
- struct gatt_channel *channel = user_data;
-
channel->server->clients = g_slist_remove(channel->server->clients,
channel);
channel_free(channel);
}
+static gboolean channel_watch_cb(GIOChannel *io, GIOCondition cond,
+ gpointer user_data)
+{
+ channel_remove(user_data);
+
+ return FALSE;
+}
+
static void channel_handler(const uint8_t *ipdu, uint16_t len,
gpointer user_data)
{
NULL, NULL, NULL);
}
-guint attrib_channel_attach(GAttrib *attrib, gboolean out)
+guint attrib_channel_attach(GAttrib *attrib)
{
struct gatt_server *server;
struct btd_device *device;
channel->id = g_attrib_register(channel->attrib, GATTRIB_ALL_REQS,
channel_handler, channel, NULL);
- if (out == FALSE)
- g_attrib_set_disconnect_function(channel->attrib,
- channel_disconnect, channel);
+ channel->cleanup_id = g_io_add_watch(io, G_IO_HUP, channel_watch_cb,
+ channel);
server->clients = g_slist_append(server->clients, channel);
channel = l->data;
g_attrib_unregister(channel->attrib, channel->id);
-
- channel_disconnect(channel);
+ channel_remove(channel);
return TRUE;
}
}
attrib = g_attrib_new(io);
- attrib_channel_attach(attrib, FALSE);
+ attrib_channel_attach(attrib);
g_io_channel_unref(io);
g_attrib_unref(attrib);
}
diff --git a/src/attrib-server.h b/src/attrib-server.h
index fb4637c..7af0cfa 100644
--- a/src/attrib-server.h
+++ b/src/attrib-server.h
uint32_t attrib_create_sdp(struct btd_adapter *adapter, uint16_t handle,
const char *name);
void attrib_free_sdp(uint32_t sdp_handle);
-guint attrib_channel_attach(GAttrib *attrib, gboolean out);
+guint attrib_channel_attach(GAttrib *attrib);
gboolean attrib_channel_detach(GAttrib *attrib, guint id);
diff --git a/src/device.c b/src/device.c
index f2df9de..30c67c0 100644
--- a/src/device.c
+++ b/src/device.c
}
attrib = g_attrib_new(io);
- device->attachid = attrib_channel_attach(attrib, TRUE);
+ device->attachid = attrib_channel_attach(attrib);
if (device->attachid == 0)
error("Attribute server attach failure!");