bluez 5.3+中的Gatttool断开导致非常高的CPU使用率(Linux蓝牙)

时间:2016-03-29 15:56:49

标签: linux android-bluetooth bluez

由于自定义设备的项目限制,我使用bluez 5.37向后移植到linux 2.6。我注意到gatttool会在断开连接时导致非常高的CPU使用率。这很容易复制。在交互模式下使用gatttool连接到任何BLE设备然后断开连接。在使用disconnect命令之前,CPU使用率很低。观察CPU使用率,gatttool将超过70-80%。我也可以在Ubuntu LTS上复制它。有没有人去解决这个问题? 谢谢。

1 个答案:

答案 0 :(得分:1)

我想我发现了什么是错的。 Gatttool使用glib主事件循环,因此io通道作为源附加到默认主要上下文(阅读glib文档以获得更多说明)。作为函数cmd_connect中的'bluez / attrib / interactive.c'中的示例'g_io_add_watch(iochannel,G_IO_HUP,channel_watcher,NULL)'完成。此函数将返回一个gsource,一旦io通道丢失或删除,该gsource必须从手表中删除。如果没有这个,glib将继续等待这个io通道(fd)并导致EINVAL作为返回码。 (我的知识不完整,但我想这就是发生的事情)。因此,在断开设备连接时,需要移除此手表。 我按照以下方式做到 - 定义一个新的全局 - guint gsrc;
将cmd_connect中的行更改为 gsrc = g_io_add_watch(iochannel, G_IO_HUP, channel_watcher, NULL); 断开连接后,在return_io函数返回之前 - g_source_remove(gsrc); 这以交互模式修复了gatttool cpu使用错误。