Skip to content

Commit 94e6b6f

Browse files
committed
Switch sync_wait back to returning T and terminating on done
1 parent ab6197c commit 94e6b6f

File tree

2 files changed

+36
-35
lines changed

2 files changed

+36
-35
lines changed

p1897R3_initial_executor_algorithms_for_cpp23.html

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@ <h2 id="differences-between-r2-and-r3"><span class="header-section-number">1.1</
454454
<li>Renamed <code>let</code> to <code>let_value</code> for naming consistency.</li>
455455
<li>Updated to use P0443R13 as a baseline.</li>
456456
<li>Improves the wording to be closer to mergable wording and less pseudowording.</li>
457+
<li>Modified <code>sync_wait</code> to terminate on done rather than throwing.</li>
457458
</ul>
458459
<h2 id="differences-between-r1-and-r2"><span class="header-section-number">1.2</span> Differences between R1 and R2<a href="#differences-between-r1-and-r2" class="self-link"></a></h2>
459460
<ul>
@@ -516,7 +517,7 @@ <h2 id="summary"><span class="header-section-number">2.1</span> Summary<a href="
516517
</ul></li>
517518
<li><code>sync_wait(s)</code>
518519
<ul>
519-
<li>blocks and returns a <code>std::optional</code> of the value type of the sender, throwing on error, and an empty <code>std::optional</code> on done.</li>
520+
<li>blocks and returns a <code>T</code> of the value type of the sender, throwing on error, and terminates on done.</li>
520521
</ul></li>
521522
<li><code>when_all(s...)</code>
522523
<ul>
@@ -552,7 +553,7 @@ <h4 id="simple-example"><span class="header-section-number">2.2.0.1</span> Simpl
552553
<span id="cb1-6"><a href="#cb1-6"></a> std<span class="op">::</span>move<span class="op">(</span>just_sender<span class="op">)</span>,</span>
553554
<span id="cb1-7"><a href="#cb1-7"></a> <span class="op">[](</span><span class="dt">int</span> a<span class="op">){</span><span class="cf">return</span> a<span class="op">+</span><span class="fl">0.5</span><span class="bu">f</span>;<span class="op">})</span>;</span>
554555
<span id="cb1-8"><a href="#cb1-8"></a></span>
555-
<span id="cb1-9"><a href="#cb1-9"></a>std<span class="op">::</span>optional<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> result <span class="op">=</span> <span class="co">// value: 3.5</span></span>
556+
<span id="cb1-9"><a href="#cb1-9"></a><span class="dt">int</span> result <span class="op">=</span> <span class="co">// value: 3.5</span></span>
556557
<span id="cb1-10"><a href="#cb1-10"></a> sync_wait<span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>transform_sender<span class="op">))</span>;</span></code></pre></div>
557558
<p>In this very simple example we:</p>
558559
<ul>
@@ -561,7 +562,7 @@ <h4 id="simple-example"><span class="header-section-number">2.2.0.1</span> Simpl
561562
<li>block for the resulting value and assign the <code>float</code> value <code>3.5</code> to <code>result</code>.</li>
562563
</ul>
563564
<p>Using <code>operator|</code> as in ranges to remove the need to pass arguments around, we can represent this as:</p>
564-
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="#cb2-1"></a>std<span class="op">::</span>optional<span class="op">&lt;</span><span class="dt">float</span><span class="op">&gt;</span> f <span class="op">=</span> sync_wait<span class="op">(</span></span>
565+
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="#cb2-1"></a><span class="dt">float</span> f <span class="op">=</span> sync_wait<span class="op">(</span></span>
565566
<span id="cb2-2"><a href="#cb2-2"></a> just<span class="op">(</span><span class="dv">3</span><span class="op">)</span> <span class="op">|</span> transform<span class="op">([](</span><span class="dt">int</span> a<span class="op">){</span><span class="cf">return</span> a<span class="op">+</span><span class="fl">0.5</span><span class="bu">f</span>;<span class="op">}))</span>;</span></code></pre></div>
566567
<!--
567568
#### Using indexed_for
@@ -622,7 +623,7 @@ <h4 id="using-when_all"><span class="header-section-number">2.2.0.2</span> Using
622623
<span id="cb3-12"><a href="#cb3-12"></a> <span class="cf">return</span> vec;</span>
623624
<span id="cb3-13"><a href="#cb3-13"></a> <span class="op">})</span></span>
624625
<span id="cb3-14"><a href="#cb3-14"></a></span>
625-
<span id="cb3-15"><a href="#cb3-15"></a>std<span class="op">::</span>optional<span class="op">&lt;</span>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;&gt;</span> result <span class="op">=</span> <span class="co">// value: {3, 4, 5}</span></span>
626+
<span id="cb3-15"><a href="#cb3-15"></a>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> result <span class="op">=</span> <span class="co">// value: {3, 4, 5}</span></span>
626627
<span id="cb3-16"><a href="#cb3-16"></a> sync_wait<span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>transform_sender<span class="op">))</span>;</span></code></pre></div>
627628
<p>This demonstrates simple joining of senders:</p>
628629
<ul>
@@ -633,12 +634,12 @@ <h4 id="using-when_all"><span class="header-section-number">2.2.0.2</span> Using
633634
<li>block for the resulting value and assign vector {3, 4, 5} to <code>result</code></li>
634635
</ul>
635636
<p>Using <code>operator|</code> as in ranges to remove the need to pass arguments around, we can represent this as:</p>
636-
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="#cb4-1"></a>std<span class="op">::</span>optional<span class="op">&lt;</span>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;&gt;</span> result_vec <span class="op">=</span> sync_wait<span class="op">(</span></span>
637+
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="#cb4-1"></a>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> result_vec <span class="op">=</span> sync_wait<span class="op">(</span></span>
637638
<span id="cb4-2"><a href="#cb4-2"></a> when_all<span class="op">(</span>just<span class="op">(</span>std<span class="op">::</span>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;{</span><span class="dv">3</span>, <span class="dv">4</span>, <span class="dv">5</span><span class="op">}</span>, <span class="dv">10</span><span class="op">)</span>, just<span class="op">(</span><span class="fl">20.0</span><span class="bu">f</span><span class="op">))</span> <span class="op">|</span></span>
638639
<span id="cb4-3"><a href="#cb4-3"></a> transform<span class="op">([](</span>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> vec, <span class="dt">int</span> <span class="co">/*i*/</span>, <span class="dt">float</span> <span class="co">/*f*/</span><span class="op">){</span><span class="cf">return</span> vec;<span class="op">}))</span>;</span></code></pre></div>
639640
<h4 id="with-exception"><span class="header-section-number">2.2.0.3</span> With exception<a href="#with-exception" class="self-link"></a></h4>
640641
<p>A simple example showing how an exception that leaks out of a transform may propagate and be thrown from sync_wait.</p>
641-
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="#cb5-1"></a>std<span class="op">::</span>optional<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> result <span class="op">=</span> <span class="dv">0</span>;</span>
642+
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="#cb5-1"></a><span class="dt">int</span> result <span class="op">=</span> <span class="dv">0</span>;</span>
642643
<span id="cb5-2"><a href="#cb5-2"></a><span class="cf">try</span> <span class="op">{</span></span>
643644
<span id="cb5-3"><a href="#cb5-3"></a> <span class="kw">auto</span> just_sender <span class="op">=</span> just<span class="op">(</span><span class="dv">3</span><span class="op">)</span>;</span>
644645
<span id="cb5-4"><a href="#cb5-4"></a> <span class="kw">auto</span> via_sender <span class="op">=</span> via<span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>just_sender<span class="op">)</span>, scheduler1<span class="op">)</span>;</span>
@@ -663,7 +664,7 @@ <h4 id="with-exception"><span class="header-section-number">2.2.0.3</span> With
663664
<li>handle the exception</li>
664665
</ul>
665666
<p>As before, using <code>operator|</code> as in ranges to remove the need to pass arguments around, we can represent this more cleanly:</p>
666-
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb6-1"><a href="#cb6-1"></a>std<span class="op">::</span>optional<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> result <span class="op">=</span> <span class="dv">0</span>;</span>
667+
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb6-1"><a href="#cb6-1"></a><span class="dt">int</span> result <span class="op">=</span> <span class="dv">0</span>;</span>
667668
<span id="cb6-2"><a href="#cb6-2"></a><span class="cf">try</span> <span class="op">{</span></span>
668669
<span id="cb6-3"><a href="#cb6-3"></a> result <span class="op">=</span> sync_wait<span class="op">(</span></span>
669670
<span id="cb6-4"><a href="#cb6-4"></a> just<span class="op">(</span><span class="dv">3</span><span class="op">)</span> <span class="op">|</span></span>
@@ -700,7 +701,7 @@ <h4 id="handle-an-exception"><span class="header-section-number">2.2.0.4</span>
700701
</ul>
701702
<p>As before, using <code>operator|</code> as in ranges to remove the need to pass arguments around, we can represent this more cleanly:</p>
702703
<div class="sourceCode" id="cb8"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb8-1"><a href="#cb8-1"></a><span class="kw">auto</span> s <span class="op">=</span> ;</span>
703-
<span id="cb8-2"><a href="#cb8-2"></a>std<span class="op">::</span>optional<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> result <span class="op">=</span> sync_wait<span class="op">(</span></span>
704+
<span id="cb8-2"><a href="#cb8-2"></a><span class="dt">int</span> result <span class="op">=</span> sync_wait<span class="op">(</span></span>
704705
<span id="cb8-3"><a href="#cb8-3"></a> just<span class="op">(</span><span class="dv">3</span><span class="op">)</span> <span class="op">|</span></span>
705706
<span id="cb8-4"><a href="#cb8-4"></a> via<span class="op">(</span>scheduler1<span class="op">)</span> <span class="op">|</span></span>
706707
<span id="cb8-5"><a href="#cb8-5"></a> transform<span class="op">([](</span><span class="dt">float</span> a<span class="op">){</span><span class="cf">throw</span> <span class="dv">2</span>;<span class="op">})</span> <span class="op">|</span></span>
@@ -758,7 +759,7 @@ <h3 id="overview"><span class="header-section-number">3.2.1</span> Overview<a hr
758759
<span id="cb9-6"><a href="#cb9-6"></a><span class="kw">template</span> <span class="op">&lt;</span>movable<span class="op">-</span>value<span class="op">...</span> Ts<span class="op">&gt;</span></span>
759760
<span id="cb9-7"><a href="#cb9-7"></a>see<span class="op">-</span>below just<span class="op">(</span>Ts<span class="op">&amp;&amp;...</span> ts<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span>see<span class="op">-</span>below<span class="op">)</span>;</span></code></pre></div>
760761
<p><em>[ Example:</em></p>
761-
<div class="sourceCode" id="cb10"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb10-1"><a href="#cb10-1"></a>std<span class="op">::</span>optional<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> r <span class="op">=</span> sync_wait<span class="op">(</span>just<span class="op">(</span><span class="dv">3</span><span class="op">))</span>;</span>
762+
<div class="sourceCode" id="cb10"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb10-1"><a href="#cb10-1"></a><span class="dt">int</span> r <span class="op">=</span> sync_wait<span class="op">(</span>just<span class="op">(</span><span class="dv">3</span><span class="op">))</span>;</span>
762763
<span id="cb10-2"><a href="#cb10-2"></a><span class="co">// r==3</span></span></code></pre></div>
763764
<p><em>- end example]</em></p>
764765
<h3 id="wording"><span class="header-section-number">3.2.2</span> Wording<a href="#wording" class="self-link"></a></h3>
@@ -776,7 +777,7 @@ <h3 id="overview-1"><span class="header-section-number">3.3.1</span> Overview<a
776777
<span id="cb11-2"><a href="#cb11-2"></a>see<span class="op">-</span>below just_on<span class="op">(</span>Sch sch, Ts<span class="op">&amp;&amp;...</span> ts<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span>see<span class="op">-</span>below<span class="op">)</span>;</span></code></pre></div>
777778
<p><em>[ Example:</em></p>
778779
<div class="sourceCode" id="cb12"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb12-1"><a href="#cb12-1"></a>MyScheduler s;</span>
779-
<span id="cb12-2"><a href="#cb12-2"></a>std<span class="op">::</span>optional<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> r <span class="op">=</span> sync_wait<span class="op">(</span>just_on<span class="op">(</span>s, <span class="dv">3</span><span class="op">))</span>;</span>
780+
<span id="cb12-2"><a href="#cb12-2"></a><span class="dt">int</span> r <span class="op">=</span> sync_wait<span class="op">(</span>just_on<span class="op">(</span>s, <span class="dv">3</span><span class="op">))</span>;</span>
780781
<span id="cb12-3"><a href="#cb12-3"></a><span class="co">// r==3</span></span></code></pre></div>
781782
<p><em>- end example]</em></p>
782783
<h3 id="wording-1"><span class="header-section-number">3.3.2</span> Wording<a href="#wording-1" class="self-link"></a></h3>
@@ -803,14 +804,14 @@ <h3 id="wording-1"><span class="header-section-number">3.3.2</span> Wording<a hr
803804
* If moving of `e` throws, then will catch the exception and call `execution::set_error(r, e)` with the caught `exception_ptr`. -->
804805
<h2 id="executionsync_wait"><span class="header-section-number">3.4</span> execution::sync_wait<a href="#executionsync_wait" class="self-link"></a></h2>
805806
<h3 id="overview-2"><span class="header-section-number">3.4.1</span> Overview<a href="#overview-2" class="self-link"></a></h3>
806-
<p>Blocks the calling thread to wait for the passed sender to complete. Returns a <code>std::optional</code> of the value (or of <code>std::monostate</code> if the sender carries no value), throws if an exception is propagated and returns an empty <code>std::optional</code> on cancellation. On propagation of the <code>set_done()</code> signal, returns an empty optional.</p>
807+
<p>Blocks the calling thread to wait for the passed sender to complete. Returns <code>T</code> when passed a <code>typed_sender</code> that sends a <code>T</code> on the value channel, where <code>T</code> may be <code>void</code>, throws if an exception is propagated and calls <code>std::terminate</code> on propagation of the <code>set_done()</code> signal.</p>
807808
<div class="sourceCode" id="cb14"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb14-1"><a href="#cb14-1"></a><span class="kw">template</span> <span class="op">&lt;</span>execution<span class="op">::</span>typed_sender S<span class="op">&gt;</span></span>
808809
<span id="cb14-2"><a href="#cb14-2"></a>see<span class="op">-</span>below sync_wait<span class="op">(</span>S<span class="op">&amp;&amp;</span> s<span class="op">)</span>;</span>
809810
<span id="cb14-3"><a href="#cb14-3"></a><span class="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> ValueType, execution<span class="op">::</span>sender S<span class="op">&gt;</span></span>
810-
<span id="cb14-4"><a href="#cb14-4"></a>std<span class="op">::</span>optional<span class="op">&lt;</span>ValueType<span class="op">&gt;</span> sync_wait_r<span class="op">(</span>S<span class="op">&amp;&amp;</span> s<span class="op">)</span>;</span></code></pre></div>
811+
<span id="cb14-4"><a href="#cb14-4"></a>ValueType sync_wait_r<span class="op">(</span>S<span class="op">&amp;&amp;</span> s<span class="op">)</span>;</span></code></pre></div>
811812
<p><em>[ Example:</em></p>
812-
<div class="sourceCode" id="cb15"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb15-1"><a href="#cb15-1"></a>std<span class="op">::</span>optional<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> r <span class="op">=</span> sync_wait<span class="op">(</span>just<span class="op">(</span><span class="dv">3</span><span class="op">))</span>;</span>
813-
<span id="cb15-2"><a href="#cb15-2"></a>std<span class="op">::</span>optional<span class="op">&lt;</span><span class="dt">float</span><span class="op">&gt;</span> r <span class="op">=</span> sync_wait<span class="op">&lt;</span><span class="dt">float</span><span class="op">&gt;(</span>just<span class="op">(</span><span class="fl">3.5</span><span class="bu">f</span><span class="op">))</span>;</span>
813+
<div class="sourceCode" id="cb15"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb15-1"><a href="#cb15-1"></a><span class="dt">int</span> r <span class="op">=</span> sync_wait<span class="op">(</span>just<span class="op">(</span><span class="dv">3</span><span class="op">))</span>;</span>
814+
<span id="cb15-2"><a href="#cb15-2"></a><span class="dt">float</span> r <span class="op">=</span> sync_wait<span class="op">&lt;</span><span class="dt">float</span><span class="op">&gt;(</span>just<span class="op">(</span><span class="fl">3.5</span><span class="bu">f</span><span class="op">))</span>;</span>
814815
<span id="cb15-3"><a href="#cb15-3"></a><span class="co">// r==3</span></span></code></pre></div>
815816
<p><em>- end example]</em></p>
816817
<h3 id="wording-2"><span class="header-section-number">3.4.2</span> Wording<a href="#wording-2" class="self-link"></a></h3>
@@ -824,10 +825,10 @@ <h3 id="wording-2"><span class="header-section-number">3.4.2</span> Wording<a hr
824825
<ul>
825826
<li><p>Otherwise constructs a <code>receiver</code>, <code>r</code> over an implementation-defined synchronization primitive and passes <code>r</code> to <code>execution::connect(s, r)</code> returning some <code>operation_state</code> <code>os</code>. Waits on the synchronization primitive to block on completion of <code>s</code>.</p>
826827
<ul>
827-
<li>If the operation completes by calling <code>set_value(r, t)</code> then <code>sync_wait()</code> will return a value, <code>x</code>, of type <code>std::optional&lt;remove_cvref_t&lt;decltype(t)&gt;&gt;</code>, <code>X</code>, that is initialised as if by <code>X x; x.emplace(t);</code>.</li>
828-
<li>If the operation completes by calling <code>set_value(r)</code> then <code>sync_wait()</code> will return a value <code>x</code>, of type <code>std::optional&lt;std::monostate&gt;</code> that is initialised as if by <code>std::optional&lt;std::monostate&gt; x{std::in_place};</code>.</li>
828+
<li>If the operation completes by calling <code>set_value(r, t)</code> then <code>sync_wait()</code> will return a value, <code>x</code>, of type <code>remove_cvref_t&lt;decltype(t)&gt;</code>.</li>
829+
<li>If the operation completes by calling <code>set_value(r)</code> then <code>sync_wait()</code> will return <code>void</code>.</li>
829830
<li>If the operation completes by calling <code>set_error(r, e)</code> then <code>sync_wait()</code> calls <code>std::rethrow_exception(e)</code> if <code>decltype(e)</code> is <code>std::exception_ptr</code> or <code>throw e;</code> otherwise.</li>
830-
<li>If the operation completes by calling <code>set_done(r)</code> then <code>sync_wait()</code> will return a value <code>x</code>, of type <code>std::optional&lt;T&gt;</code> where <code>T</code> is consistent with the return type when the operation completes with <code>set_value</code> and that is initialised as if by <code>std::optional&lt;T&gt; x{};</code>.</li>
831+
<li>If the operation completes by calling <code>set_done(r)</code> then <code>sync_wait()</code> will call <code>std::terminate</code>.</li>
831832
</ul></li>
832833
</ul>
833834
<!--

0 commit comments

Comments
 (0)