Skip to content

Commit 6edb408

Browse files
committed
putting detection that all coroutines are co-awated wherever expected under a separate def
1 parent 69b6641 commit 6edb408

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

include/nodecpp/awaitable.h

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ struct awaitable_base {
7373
std::exception_ptr e_pending = nullptr;
7474
bool is_value = false;
7575

76+
#ifdef NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
77+
bool immediatelyReadyOrAwaited = false;
78+
#endif // NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
79+
7680
awaitable_base() {}
7781
awaitable_base(const awaitable_base &) = delete;
7882
awaitable_base &operator = (const awaitable_base &) = delete;
@@ -214,8 +218,6 @@ struct awaitable : public awaitable_base {
214218
bool coroDestroyed = false;
215219
using value_type = T;
216220

217-
bool dbgValueAvailable = false;
218-
219221
awaitable() {}
220222
awaitable(handle_type h) : coro(h) {
221223
coro.promise().myRetObject = this;
@@ -234,13 +236,13 @@ struct awaitable : public awaitable_base {
234236
}
235237

236238
~awaitable() {
237-
NODECPP_ASSERT( nodecpp::module_id, ::nodecpp::assert::AssertLevel::pedantic, dbgValueAvailable, "awaitable object may not be co_await\'ed as it should be (see stack for details)" );
239+
#ifdef NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
240+
NODECPP_ASSERT( nodecpp::module_id, ::nodecpp::assert::AssertLevel::pedantic, immediatelyReadyOrAwaited, "awaitable object may not be co_await\'ed as it should be (see stack for details)" );
241+
#endif // NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
238242
if ( !coroDestroyed )
239243
coro.promise().myRetObject = nullptr;
240244
}
241245

242-
void dbgAwaitingNotPlannedReturnedValueOfNoInterest() { dbgValueAvailable = true; }
243-
244246
typename void_type_converter<T>::type& getValue() {
245247
if constexpr ( std::is_same<void, T>::value )
246248
return placeholder_for_void_ret_type();
@@ -294,7 +296,9 @@ auto promise_type_struct<T>::return_value(T v) {
294296
{
295297
myRetObject->getValue() = v;
296298
myRetObject->is_value = true;
297-
myRetObject->dbgValueAvailable = true;
299+
#ifdef NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
300+
myRetObject->immediatelyReadyOrAwaited = true;
301+
#endif // NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
298302
}
299303
return std::experimental::suspend_never{};
300304
}
@@ -304,7 +308,9 @@ auto promise_type_struct<void>::return_void(void) {
304308
if ( myRetObject != nullptr )
305309
{
306310
myRetObject->is_value = true;
307-
myRetObject->dbgValueAvailable = true;
311+
#ifdef NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
312+
myRetObject->immediatelyReadyOrAwaited = true;
313+
#endif // NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
308314
}
309315
return std::experimental::suspend_never{};
310316
}
@@ -322,6 +328,23 @@ void promise_type_struct<void>::unhandled_exception() {
322328
}
323329

324330

331+
#ifdef NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
332+
template<class T>
333+
void dbg_awaitingNotPlannedReturnedValueOfNoInterest( awaitable<T>& p ) {
334+
p.immediatelyReadyOrAwaited = true;
335+
}
336+
337+
inline
338+
void dbg_awaitingNotPlannedReturnedValueOfNoInterest( awaitable<void>& p ) {
339+
p.immediatelyReadyOrAwaited = true;
340+
}
341+
#else
342+
template<class T> void dbg_awaitingNotPlannedReturnedValueOfNoInterest( awaitable<T>& p ) {}
343+
inline void dbg_awaitingNotPlannedReturnedValueOfNoInterest( awaitable<void>& p ) {}
344+
#endif // NODECPP_ENABLE_CHECKING_COROUTINES_AWAITED
345+
346+
347+
325348
template<class ... T>
326349
auto wait_for_all( nodecpp::awaitable<T>& ... calls ) -> nodecpp::awaitable<std::tuple<typename nodecpp::void_type_converter<T>::type...>>
327350
{

test/experimental/test_co_await/co_await_hierarchy.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ class page_processor_alt
641641
nodecpp::awaitable<void> coro_run_no_await_admissible()
642642
{
643643
auto ar = complete_page_void();
644-
ar.dbgAwaitingNotPlannedReturnedValueOfNoInterest();
644+
dbg_awaitingNotPlannedReturnedValueOfNoInterest(ar);
645645
fmt::print( "if we're here immediately, it could, in general, be wrong, but we don't care about it\n" );
646646
co_return;
647647
}
@@ -760,11 +760,11 @@ template<class P>
760760
nodecpp::awaitable<void> processing_loop_core_4_void(P& p)
761761
{
762762
auto r1 = p.preader_0->runVoid();
763-
r1.dbgAwaitingNotPlannedReturnedValueOfNoInterest();
763+
dbg_awaitingNotPlannedReturnedValueOfNoInterest(r1);
764764
auto r2 = p.preader_1->run2Void();
765-
r2.dbgAwaitingNotPlannedReturnedValueOfNoInterest();
765+
dbg_awaitingNotPlannedReturnedValueOfNoInterest(r2);
766766
auto r3 = p.preader_2->run1Void(1);
767-
r3.dbgAwaitingNotPlannedReturnedValueOfNoInterest();
767+
dbg_awaitingNotPlannedReturnedValueOfNoInterest(r3);
768768
co_return;
769769
}
770770

0 commit comments

Comments
 (0)