Hello,

curl_easy_pause() documentation says:
> While it may feel tempting, take care and notice that you cannot
> call this function from another thread. To unpause...


I have tested the opposite: we can although the document says "you
cannot"... with http(s) 1.1, with threads reading in a round robin mode
-very stupid, but just for testing-, protected by semaphores,
pausing in one thread and unpausing in another, it works fine (amd64 and
ARM).

Code sample of the threaded reader:

    while(!fcurl_eof(fcurl)) {
        sz = fcurl_read(buf, 1, BUFSIZE, fcurl);
        if (sz > 0) {
            wsz = write(STDOUT_FILENO, buf, sz);
            if (wsz != sz) {
                fprintf(stderr, "write() %ld bytes failed\n", (long)sz);
                exit(1);
            }
        }
        if (0 == --chunks) {
            curl_easy_pause(fcurl->curl, CURLPAUSE_ALL);
            sem_post(&sem[(i + 1) % NTHREADS]);
            chunks = CHUNKS;
            sem_wait(&sem[i]);
            curl_easy_pause(fcurl->curl, CURLPAUSE_CONT);
        }
    }

The only visible effect is that on "verbose" mode, on my Raspberry Pi 4
with curl 7.64, it is spitting a ton of messages:

* Expire in 0 ms for 6 (transfer 0x....)

(I can't find this message in the current source of libcurl, and it is
not displayed either on my Ubuntu's curl 7.68)


Questions: what could fail here if we do what the documentation says we
cannot do, but seems to work with proper synchronisation primitives:
semaphores or the like?

Apart from Async DNS, I can't see any "mutexes" in the library code,
other protocols have that kind of thing that would make the above code
enter in a deadlock?




Subsidiary question, I have made a version of fcurl totally replacing
mallocs/free by pauses/resume (no multi-threading here!)

The code is shorter and simpler, and let libcurl do its job with memory
management!

Since it is not at all a bug fix (your version was working fine after my
initial PR) but a different algorithm, would you like a PR?


Cheers

Alain

-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette:   https://curl.se/mail/etiquette.html

Reply via email to