> On Mar 13, 2018, at 4:18 PM, Daniel Stenberg <[email protected]> wrote: > > On Mon, 12 Mar 2018, Philip Prindeville wrote: > >> Problem is that weird things seem to happen if you’re able to unpause your >> Curl handle in the timer callback, then that causes the write callback to >> fire immediately (before the timer callback has even completed). > > This behavior is documented in the curl_easy_pause man page: > > When this function is called to unpause reading, the chance is high that you > will get your write callback called before this function returns. >
Attaching a couple of files.
First is a tweaking of new-hiperfifo.c to do:
* use member struct event’s instead of pointers to alloc’d struct events;
* simplify the cases for the mcode_or_die() function via macros;
* make multi_timer_cb() actually do what the block comment says it should;
* accept a “stop” command on the FIFO to shut down the service;
* use cleaner notation for unused variables than the (void) hack;
* allow following redirections (304’s);
it’s not directly related to the above issue, but I then cut & pasted my “new
and improved” version of hiperfifo.c into a new file which I then munged into a
test case.
The test case:
* removes the FIFO stuff, expecting URL’s as command-line arguments instead;
* append received data in write_cb() to a buffer which is part of the ConnInfo
structure;
* write_cb() pauses the stream if there’s inadequate room at the end of the
buffer;
* added a periodic timer ticking at 10Hz, which tries to consume a random
number of bytes (between 0-256K bytes);
* the periodic timer resumes the stream if the buffer has been completely
emptied;
What I’m seeing when the stream gets resumed looks like:
…
write_cb: buffer now 1580797 bytes
REMAINING: 1
REMAINING: 1
REMAINING: 1
REMAINING: 1
REMAINING: 1
REMAINING: 1
REMAINING: 1
REMAINING: 1
REMAINING: 1
REMAINING: 1
REMAINING: 1
write_cb: need 16384 but have 16 (pausing)
socket callback: s=6 e=0x632c70 what=REMOVE
REMAINING: 1
tick: want 89343 bytes (avail 1580797)
tick: want 37962 bytes (avail 1491454)
tick: want 88300 bytes (avail 1453492)
tick: want 139049 bytes (avail 1365192)
tick: want 31949 bytes (avail 1226143)
tick: want 219322 bytes (avail 1194194)
tick: want 186283 bytes (avail 974872)
tick: want 82418 bytes (avail 788589)
tick: want 204539 bytes (avail 706171)
tick: want 174563 bytes (avail 501632)
tick: want 123206 bytes (avail 327069)
tick: want 196732 bytes (avail 203863)
tick: want 25282 bytes (avail 7131)
tick: resuming stream
write_cb: buffer now 16384 bytes
tick: want 2132 bytes (avail 16384)
…
i.e. after the stream is resumed via:
curl_easy_pause(conn->easy, CURLPAUSE_CONT);
a single additional write callback occurs appending data, but then no more…
Not entirely clear why.
Thanks,
-Philip
new-hiperfifo.c
Description: Binary data
pacing.c
Description: Binary data
------------------------------------------------------------------- Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library Etiquette: https://curl.haxx.se/mail/etiquette.html
