@@ -170,5 +170,64 @@ KJ_TEST("kj::Promise<DeferredProxy<T>>: can be `co_await`ed from another corouti
170
170
KJ_EXPECT (proxyTask.wait (waitScope) == 123 );
171
171
}
172
172
173
+ struct Counter {
174
+ size_t & wind;
175
+ size_t & unwind;
176
+ Counter (size_t & wind, size_t & unwind): wind(wind), unwind(unwind) { ++wind; }
177
+ ~Counter () { ++unwind; }
178
+ KJ_DISALLOW_COPY_AND_MOVE (Counter);
179
+ };
180
+
181
+ kj::Promise<DeferredProxy<void >> cancellationTester (
182
+ kj::Promise<void > preDeferredProxying,
183
+ kj::Promise<void > postDeferredProxying,
184
+ size_t & wind,
185
+ size_t & unwind) {
186
+ Counter preCounter (wind, unwind);
187
+ co_await preDeferredProxying;
188
+ KJ_CO_MAGIC BEGIN_DEFERRED_PROXYING;
189
+ Counter postCounter (wind, unwind);
190
+ co_await postDeferredProxying;
191
+ };
192
+
193
+ KJ_TEST (" kj::Promise<DeferredProxy<T>>: can be canceled while suspended before deferred proxying" ) {
194
+ kj::EventLoop loop;
195
+ kj::WaitScope waitScope (loop);
196
+
197
+ size_t wind = 0 , unwind = 0 ;
198
+
199
+ {
200
+ auto neverDone1 = kj::Promise<void >(kj::NEVER_DONE);
201
+ auto neverDone2 = kj::Promise<void >(kj::NEVER_DONE);
202
+ neverDone1 = neverDone1.attach (kj::heap<Counter>(wind, unwind));
203
+ neverDone2 = neverDone2.attach (kj::heap<Counter>(wind, unwind));
204
+ auto promise = cancellationTester (kj::mv (neverDone1), kj::mv (neverDone2), wind, unwind);
205
+ KJ_EXPECT (!promise.poll (waitScope));
206
+ }
207
+
208
+ KJ_EXPECT (wind == 3 );
209
+ KJ_EXPECT (unwind == 3 );
210
+ }
211
+
212
+ KJ_TEST (" kj::Promise<DeferredProxy<T>>: can be canceled while suspended after deferred proxying" ) {
213
+ kj::EventLoop loop;
214
+ kj::WaitScope waitScope (loop);
215
+
216
+ size_t wind = 0 , unwind = 0 ;
217
+
218
+ {
219
+ auto readyNow = kj::Promise<void >(kj::READY_NOW);
220
+ auto neverDone = kj::Promise<void >(kj::NEVER_DONE);
221
+ readyNow = readyNow.attach (kj::heap<Counter>(wind, unwind));
222
+ neverDone = neverDone.attach (kj::heap<Counter>(wind, unwind));
223
+ auto promise = cancellationTester (kj::mv (readyNow), kj::mv (neverDone), wind, unwind);
224
+ auto proxyTask = promise.wait (waitScope).proxyTask ;
225
+ KJ_EXPECT (!proxyTask.poll (waitScope));
226
+ }
227
+
228
+ KJ_EXPECT (wind == 4 );
229
+ KJ_EXPECT (unwind == 4 );
230
+ }
231
+
173
232
} // namespace
174
233
} // namespace workerd::api
0 commit comments