When run_loop was proposed, the only implementation we had synchronized with a mutex and a condition variable. Operations on those can theoretically throw exceptions, so run_loop got a set_error_t(exception_ptr) completion signature.
Since then, a lock-free implementation of run_loop has been found*. Atomic operations cannot fail with an exception, so an atomic run_loop can never complete with an error.
Proposed Wording
change the class synopsis of run_loop ([exec.run.loop.general]) as follows:
namespace std::execution {
class run_loop {
// [exec.run.loop.types], associated types
class run-loop-scheduler; // exposition only
class run-loop-sender; // exposition only
struct run-loop-opstate-base { // exposition only
- virtual void execute() = 0; // exposition only
+ virtual void execute() noexcept = 0; // exposition only
run_loop* loop; // exposition only
run-loop-opstate-base* next; // exposition only
};
template<class Rcvr>
using run-loop-opstate = unspecified; // exposition only
// [exec.run.loop.members], member functions
- run-loop-opstate-base* pop-front(); // exposition only
- void push-back(run-loop-opstate-base*); // exposition only
+ run-loop-opstate-base* pop-front() noexcept; // exposition only
+ void push-back(run-loop-opstate-base*) noexcept; // exposition only
public:
// [exec.run.loop.ctor], constructor and destructor
run_loop() noexcept;
run_loop(run_loop&&) = delete;
~run_loop();
// [exec.run.loop.members], member functions
- run-loop-scheduler get_scheduler();
- void run();
- void finish();
+ run-loop-scheduler get_scheduler() noexcept;
+ void run() noexcept;
+ void finish() noexcept;
};
}
Change [exec.run.loop.types]/p5 as follows:
run-loop-sender is an exposition-only type that satisfies sender.
completion_signatures_of_t<run-loop-sender> is
- completion_signatures<set_value_t(), set_error_t(exception_ptr), set_stopped_t()>
+ completion_signatures<set_value_t(), set_stopped_t()>
Change [exec.run.loop.types]/p9.3 as follows:
The expression start(o) is equivalent to:
- try {
o.loop->push-back(addressof(o));
- } catch(...) {
- set_error(std::move(REC(o)), current_exception());
- }
In [exec.run.loop.members], change the prototypes of the following member functions to add noexcept:
pop-front
push-back
get_scheduler
run
finish
When
run_loopwas proposed, the only implementation we had synchronized with a mutex and a condition variable. Operations on those can theoretically throw exceptions, sorun_loopgot aset_error_t(exception_ptr)completion signature.Since then, a lock-free implementation of
run_loophas been found*. Atomic operations cannot fail with an exception, so an atomicrun_loopcan never complete with an error.Proposed Wording
change the class synopsis of
run_loop([exec.run.loop.general]) as follows:namespace std::execution { class run_loop { // [exec.run.loop.types], associated types class run-loop-scheduler; // exposition only class run-loop-sender; // exposition only struct run-loop-opstate-base { // exposition only - virtual void execute() = 0; // exposition only + virtual void execute() noexcept = 0; // exposition only run_loop* loop; // exposition only run-loop-opstate-base* next; // exposition only }; template<class Rcvr> using run-loop-opstate = unspecified; // exposition only // [exec.run.loop.members], member functions - run-loop-opstate-base* pop-front(); // exposition only - void push-back(run-loop-opstate-base*); // exposition only + run-loop-opstate-base* pop-front() noexcept; // exposition only + void push-back(run-loop-opstate-base*) noexcept; // exposition only public: // [exec.run.loop.ctor], constructor and destructor run_loop() noexcept; run_loop(run_loop&&) = delete; ~run_loop(); // [exec.run.loop.members], member functions - run-loop-scheduler get_scheduler(); - void run(); - void finish(); + run-loop-scheduler get_scheduler() noexcept; + void run() noexcept; + void finish() noexcept; }; }Change [exec.run.loop.types]/p5 as follows:
Change [exec.run.loop.types]/p9.3 as follows:
In [exec.run.loop.members], change the prototypes of the following member functions to add
noexcept:pop-frontpush-backget_schedulerrunfinish