小编Pul*_*ulo的帖子

curl_multi_wakeup 似乎没有唤醒相关的 curl_multi_poll - Android(但可能不限于)

卷曲版本:7.71.0 带 c-ares

背景

我们正在构建一个集成到移动应用程序中的库。我们同时针对 iOS 和 Android。Curl 初始化发生在库内的静态块中。

如果我没记错的话,该库的 iOS 版本被捆绑到一个框架中,该框架在应用程序启动时加载。该库的 Android 版本捆绑在一个模块中,该模块被延迟加载。(我知道这是一个问题,特别是因为我们链接到 OpenSSL,但这对于上下文可能很重要)。

我们使用 curl 构建了一个小型 HTTP 客户端,它允许用于从受信任的服务器下载一些数据 blob。

快速架构审查

HTTP 客户端在其自己的线程上运行。它持有 a curl_multi_handle,并且任何传输开始时都将 a 附加curl_easy_handle到它,并返回一个Response包含缓冲区的句柄以从中读取接收到的字节,并在需要时用于控制传输。

由于 cURL 句柄不是线程安全的,因此对该句柄的任何操作(从现在开始称为任务)都被分派到 HTTP 客户端的线程,并且 boost::shared_future返回 a(我们可能想阻止或不阻止,具体取决于用例)。

以下是主循环结构的粗略概念:

while (!done) {
    deal_with_transfer();
    check_transfer_status();
    cleanup_any_orphan_transfer();
    execute_all_queue_tasks();
    curl_multi_poll(multi, nullptr, 0, very_large_number, nullptr);
}
Run Code Online (Sandbox Code Playgroud)

附加到任务队列还执行 acurl_multi_wakeup(multi)以确保任务被执行(例如,添加新下载也是一个分派任务)。

问题

到目前为止,我们只在 Android 上进行了测试,并且我们看到在某些情况下,被阻塞的 HTTP 客户端任务有时永远不会返回。

日志和堆栈跟踪显示我们等待 HTTP 客户端正在执行的任务,但客户端仍在轮询。一切似乎都表明它在附加任务时没有被唤醒。

我似乎无法在设备上本地复制该问题,但它经常发生,足以成为一个阻止程序问题。

我在这里有点不知所措,我真的不知道从哪里开始寻找重现问题的方法,更不用说修复它了。

我希望我提供了足够的上下文来开始进行有根据的猜测,甚至找到错误的根源!

谢谢阅读!

c c++ android curl

9
推荐指数
1
解决办法
187
查看次数

标签 统计

android ×1

c ×1

c++ ×1

curl ×1