{"author":"Stefan Eissing","author_email":"stefan@eissing.org","author_time":1750242883,"commit_time":1750519151,"committer":"Daniel Stenberg","committer_email":"daniel@haxx.se","hash":"779937f8400910924154afafb85dedbe95b7dffa","message":"multi: add dirty bitset\n\nAdd a bitset `dirty` to the multi handle. The presence of a transfer int\nhe \"dirty\" set means: this transfer has something to do ASAP.\n\n\"dirty\" is set by multiplexing protocols like HTTP/2 and 3 when\nencountering response data for another transfer than the current one.\n\"dirty\" is set by protocols that want to be called.\n\nImplementation:\n\n* just an additional `uint_bset` in the multi handle\n* `Curl_multi_mark_dirty()` to add a transfer to the dirty set.\n* `multi_runsingle()` clears the dirty bit of the transfer at\n   start. Without new dirty marks, this empties the set after\n   al dirty transfers have been run.\n* `multi_timeout()` immediately gives the current time and\n   timeout_ms == 0 when dirty transfers are present.\n* multi_event: marks all transfers tracked for a socket as dirty.\n  Then marks all expired transfers as dirty. Then it runs\n  all dirty transfers.\n\nWith this mechanism:\n\n* Most uses of `EXPIRE_RUN_NOW` are replaced by `Curl_multi_mark_dirty()`\n* `Curl_multi_mark_dirty()` is cheaper than querying if a transfer is\n  already dirty or set for timeout. There is no need to check, just do it.\n* `data->state.select_bits` is eliminated. We need no longer to\n  simulate a poll event to make a transfer run.\n\nCloses #17662\n","parents":["7aa8d1eea1fe60b26e88abe2c672f70bf30f63cc"],"tree_hash":"067f7314e8641e9d80e8a24db669d8ccd052d597"}