run_loop::run() are too strictSection: 33.12.1.4 [exec.run.loop.members] Status: Resolved Submitter: Eric Niebler Opened: 2024-09-05 Last modified: 2025-02-07
Priority: Not Prioritized
View all issues with Resolved status.
Discussion:
From sender-receiver/issues #280:
The precondition onrun_loop::run() is that the state is starting.
Given that run_loop::finish() puts the loop in the finishing state, the implication
is that one cannot call finish() before calling run().
However, in most cases sync_wait is calling finish() on its run_loop
before calling run(), violating this precondition. sync_wait does the following:
run_loop loop;
auto op = connect(sndr, sync_wait_receiver{&loop});
start(op);
loop.run();
If sndr completes synchronously, the sync_wait_receiver will call finish()
on the loop before loop.run() is called, violating run's precondition.
[2025-02-07 Status changed: New → Resolved.]
Resolved by P3396R1.
Proposed resolution:
This wording is relative to N4988.
Modify 33.12.1.4 [exec.run.loop.members] as indicated:
void run();-5- Preconditions:
-6- Effects: Sets thestateis starting or finishing.stateto running. Then, equivalent to:while (auto* op = pop-front()) { op->execute(); }-7- Remarks: When
statechanges, it does so without introducing data races.