Skip to content

Commit fb9ef7b

Browse files
authored
Remove low-level coroutine suspension notifications (#1228)
1 parent 5ca626a commit fb9ef7b

File tree

11 files changed

+27
-401
lines changed

11 files changed

+27
-401
lines changed

strings/base_coroutine_foundation.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -577,11 +577,6 @@ namespace winrt::impl
577577

578578
auto final_suspend() noexcept
579579
{
580-
if (winrt_suspend_handler)
581-
{
582-
winrt_suspend_handler(this);
583-
}
584-
585580
return final_suspend_awaiter{ this };
586581
}
587582

@@ -606,14 +601,23 @@ namespace winrt::impl
606601
}
607602

608603
template <typename Expression>
609-
auto await_transform(Expression&& expression)
604+
Expression&& await_transform(Expression&& expression)
610605
{
611606
if (Status() == AsyncStatus::Canceled)
612607
{
613608
throw winrt::hresult_canceled();
614609
}
615610

616-
return notify_awaiter<Expression>{ static_cast<Expression&&>(expression), m_propagate_cancellation ? &m_cancellable : nullptr };
611+
if constexpr (std::is_convertible_v<std::remove_reference_t<decltype(expression)>&, enable_await_cancellation&>)
612+
{
613+
if (m_propagate_cancellation)
614+
{
615+
static_cast<enable_await_cancellation&>(expression).set_cancellable_promise(&m_cancellable);
616+
expression.enable_cancellation(&m_cancellable);
617+
}
618+
}
619+
620+
return std::forward<Expression>(expression);
617621
}
618622

619623
cancellation_token<Derived> await_transform(get_cancellation_token_t) noexcept

strings/base_coroutine_threadpool.h

Lines changed: 0 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -133,26 +133,6 @@ namespace winrt::impl
133133
resume_apartment_sync(context.m_context, handle, failure);
134134
}
135135
}
136-
137-
template <typename T>
138-
class awaiter_finder
139-
{
140-
template <typename> static constexpr bool find_awaitable_member(...) { return false; }
141-
template <typename> static constexpr bool find_co_await_member(...) { return false; }
142-
template <typename> static constexpr bool find_co_await_free(...) { return false; }
143-
144-
#ifdef WINRT_IMPL_COROUTINES
145-
template <typename U, typename = decltype(std::declval<U>().await_ready())> static constexpr bool find_awaitable_member(int) { return true; }
146-
template <typename U, typename = decltype(std::declval<U>().operator co_await())> static constexpr bool find_co_await_member(int) { return true; }
147-
template <typename U, typename = decltype(operator co_await(std::declval<U>()))> static constexpr bool find_co_await_free(int) { return true; }
148-
#endif
149-
150-
public:
151-
152-
static constexpr bool has_awaitable_member = find_awaitable_member<T>(0);
153-
static constexpr bool has_co_await_member = find_co_await_member<T&&>(0);
154-
static constexpr bool has_co_await_free = find_co_await_free<T&&>(0);
155-
};
156136
}
157137

158138
WINRT_EXPORT namespace winrt
@@ -226,76 +206,6 @@ WINRT_EXPORT namespace winrt
226206
};
227207
}
228208

229-
namespace winrt::impl
230-
{
231-
template <typename T>
232-
decltype(auto) get_awaiter(T&& value) noexcept
233-
{
234-
#ifdef WINRT_IMPL_COROUTINES
235-
if constexpr (awaiter_finder<T>::has_co_await_member)
236-
{
237-
static_assert(!awaiter_finder<T>::has_co_await_free, "Ambiguous operator co_await (as both member and free function).");
238-
return static_cast<T&&>(value).operator co_await();
239-
}
240-
else if constexpr (awaiter_finder<T>::has_co_await_free)
241-
{
242-
return operator co_await(static_cast<T&&>(value));
243-
}
244-
else
245-
{
246-
static_assert(awaiter_finder<T>::has_awaitable_member, "Not an awaitable type");
247-
return static_cast<T&&>(value);
248-
}
249-
#else
250-
return static_cast<T&&>(value);
251-
#endif
252-
}
253-
254-
template <typename T>
255-
struct notify_awaiter
256-
{
257-
decltype(get_awaiter(std::declval<T&&>())) awaitable;
258-
259-
notify_awaiter(T&& awaitable_arg, [[maybe_unused]] cancellable_promise* promise = nullptr) : awaitable(get_awaiter(static_cast<T&&>(awaitable_arg)))
260-
{
261-
if constexpr (std::is_convertible_v<std::remove_reference_t<decltype(awaitable)>&, enable_await_cancellation&>)
262-
{
263-
if (promise)
264-
{
265-
static_cast<enable_await_cancellation&>(awaitable).set_cancellable_promise(promise);
266-
awaitable.enable_cancellation(promise);
267-
}
268-
}
269-
}
270-
271-
bool await_ready()
272-
{
273-
if (winrt_suspend_handler)
274-
{
275-
winrt_suspend_handler(this);
276-
}
277-
278-
return awaitable.await_ready();
279-
}
280-
281-
template <typename U>
282-
auto await_suspend(coroutine_handle<U> handle)
283-
{
284-
return awaitable.await_suspend(handle);
285-
}
286-
287-
decltype(auto) await_resume()
288-
{
289-
if (winrt_resume_handler)
290-
{
291-
winrt_resume_handler(this);
292-
}
293-
294-
return awaitable.await_resume();
295-
}
296-
};
297-
}
298-
299209
WINRT_EXPORT namespace winrt
300210
{
301211
[[nodiscard]] inline auto resume_background() noexcept
@@ -728,24 +638,13 @@ namespace std::experimental
728638

729639
suspend_never final_suspend() const noexcept
730640
{
731-
if (winrt_suspend_handler)
732-
{
733-
winrt_suspend_handler(this);
734-
}
735-
736641
return{};
737642
}
738643

739644
void unhandled_exception() const noexcept
740645
{
741646
winrt::terminate();
742647
}
743-
744-
template <typename Expression>
745-
auto await_transform(Expression&& expression)
746-
{
747-
return winrt::impl::notify_awaiter<Expression>{ static_cast<Expression&&>(expression) };
748-
}
749648
};
750649
};
751650
}

strings/base_extern.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
__declspec(selectany) int32_t(__stdcall* winrt_to_hresult_handler)(void* address) noexcept {};
33
__declspec(selectany) winrt::hstring(__stdcall* winrt_to_message_handler)(void* address) {};
44
__declspec(selectany) void(__stdcall* winrt_throw_hresult_handler)(uint32_t lineNumber, char const* fileName, char const* functionName, void* returnAddress, winrt::hresult const result) noexcept {};
5-
__declspec(selectany) void(__stdcall* winrt_suspend_handler)(void const* token) noexcept {};
6-
__declspec(selectany) void(__stdcall* winrt_resume_handler)(void const* token) noexcept {};
75
__declspec(selectany) int32_t(__stdcall* winrt_activation_handler)(void* classId, winrt::guid const& iid, void** factory) noexcept {};
86

97
extern "C"

test/old_tests/UnitTests/async.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace
2222

2323
IAsyncAction NoSuspend_IAsyncAction()
2424
{
25-
co_await resume_after(0s);
25+
co_await 0s;
2626

2727
auto cancel = co_await get_cancellation_token();
2828

@@ -34,7 +34,7 @@ namespace
3434

3535
IAsyncActionWithProgress<double> NoSuspend_IAsyncActionWithProgress()
3636
{
37-
co_await resume_after(0s);
37+
co_await 0s;
3838

3939
auto cancel = co_await get_cancellation_token();
4040

@@ -46,7 +46,7 @@ namespace
4646

4747
IAsyncOperation<uint32_t> NoSuspend_IAsyncOperation()
4848
{
49-
co_await resume_after(0s);
49+
co_await 0s;
5050

5151
auto cancel = co_await get_cancellation_token();
5252

@@ -60,7 +60,7 @@ namespace
6060

6161
IAsyncOperationWithProgress<uint64_t, uint64_t> NoSuspend_IAsyncOperationWithProgress()
6262
{
63-
co_await resume_after(0s);
63+
co_await 0s;
6464

6565
auto cancel = co_await get_cancellation_token();
6666

test/test/async_ref_result.cpp

Lines changed: 0 additions & 71 deletions
This file was deleted.

test/test/async_throw.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,26 @@ namespace
1212

1313
IAsyncAction Action()
1414
{
15-
co_await resume_after(10ms);
15+
co_await 10ms;
1616
throw hresult_invalid_argument(L"Async");
1717
}
1818

1919
IAsyncActionWithProgress<int> ActionWithProgress()
2020
{
21-
co_await resume_after(10ms);
21+
co_await 10ms;
2222
throw hresult_invalid_argument(L"Async");
2323
}
2424

2525
IAsyncOperation<int> Operation()
2626
{
27-
co_await resume_after(10ms);
27+
co_await 10ms;
2828
throw hresult_invalid_argument(L"Async");
2929
co_return 1;
3030
}
3131

3232
IAsyncOperationWithProgress<int, int> OperationWithProgress()
3333
{
34-
co_await resume_after(10ms);
34+
co_await 10ms;
3535
throw hresult_invalid_argument(L"Async");
3636
co_return 1;
3737
}

test/test/disconnected.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace
1616

1717
IAsyncActionWithProgress<int> ActionProgress()
1818
{
19-
co_await resume_after(500ms);
19+
co_await 500ms;
2020
auto progress = co_await get_progress_token();
2121
progress(123);
2222
co_return;
@@ -29,7 +29,7 @@ namespace
2929

3030
IAsyncOperationWithProgress<int, int> OperationProgress()
3131
{
32-
co_await resume_after(500ms);
32+
co_await 500ms;
3333
auto progress = co_await get_progress_token();
3434
progress(123);
3535
co_return 123;

0 commit comments

Comments
 (0)