curl / Mailing Lists / curl-library / Single Mail
Buy commercial curl support from WolfSSL. We help you work out your issues, debug your libcurl applications, use the API, port to new platforms, add new features and more. With a team lead by the curl founder himself.

curl_multi_wakeup doesn't seem to wakeup the associated curl_multi_poll - Android (but may not be limited to)

From: Florian Morel via curl-library <curl-library_at_cool.haxx.se>
Date: Tue, 8 Jun 2021 16:25:57 +0200

Hi folks!

This question was originally posted on Stack Overflow, but I was asked to
post it here to have better support. Here it is!

Curl version: 7.71.0 with c-ares

Background
We are building a library that's being integrated into mobile apps. We are
targeting both iOS and Android. Curl initialisation happens in a static
block inside the library.

The iOS version of the library is bundled into a framework, uses DarwinSSL
and is loaded at app startup.
The Android version of the library is bundled in a module, which is lazily
loaded. (I know this is an issue, especially since we link against OpenSSL,
but it's probably important for context).

We built a small HTTP client with curl, that allows us to download some
data blob from trusted servers.

Quick architecture review
The HTTP client is running on its own thread.
It holds a curl_multi_handle, and any transfer started append a
curl_easy_handle to it, and return a handle to a Response that contains a
buffer to read the received bytes from, and is used to control the transfer
if needed.

Since cURL handles are not thread safe, any action (referred to as Tasks
from now on) to the handle is dispatched to the HTTP client's thread, and a
boost::shared_future is returned (we might want to block or not depending
on the use case).

Here is a rough idea of how the main loop is structured:

while (!done) {
    deal_with_transfer();
    check_transfer_status();
    cleanup_any_orphan_transfer();
    execute_all_queued_tasks();
    curl_multi_poll(multi, nullptr, 0, very_large_number, nullptr);
}

Appending to the task queue also performs a curl_multi_wakeup(multi) to
make sure that task is executed (e.g. adding a new download is also a
dispatched task).

The issue
We've only thus far tested on Android, and we've seen in some cases, HTTP
client tasks that are blocking are sometimes never returning.

Logs and stacktraces show that we wait on a task being executed on by the
HTTP client, but the client is still polling. Everything seems to indicate
that it was't woken up when appending a task.

I can't seem to replicate the issue locally, on a device, but it happens
often enough to be a blocker issue.

I'm a bit at a loss here, and I don't really know where to start looking to
find a way to reproduce the issue, let alone fixing it.

I hope I gave enough context to start making educated guess, or even find a
the source of error!

Thanks for reading!

-- 
Florian Morel
Engineer, Audio Workflow
SoundCloud Ltd. | Rheinsberger Str. 76/77, 10115 Berlin, Germany
Managing Director: Artem Fishman | Incorporated in England & Wales
with Company No. 6343600 | Local Branch Office | AG Charlottenburg  | HRB
110657B


-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette: https://curl.se/mail/etiquette.html
Received on 2021-06-08