Do not wait for cancellation signal (#4664)
* Do not wait for cancelation signal * Test * Explicit constructor
This commit is contained in:
parent
f7232cd0dc
commit
6a802b2359
2 changed files with 29 additions and 11 deletions
|
|
@ -56,10 +56,30 @@ TEST (async, cancellation)
|
|||
|
||||
cancellation.emit ();
|
||||
|
||||
ASSERT_EQ (fut.wait_for (500ms), std::future_status::ready);
|
||||
ASSERT_EQ (fut.wait_for (1s), std::future_status::ready);
|
||||
ASSERT_NO_THROW (fut.get ());
|
||||
}
|
||||
|
||||
// Test that cancellation signal behaves well when the cancellation is emitted after the task has completed
|
||||
TEST (async, cancellation_lifetime)
|
||||
{
|
||||
test_context ctx;
|
||||
|
||||
nano::async::cancellation cancellation{ ctx.strand };
|
||||
{
|
||||
auto fut = asio::co_spawn (
|
||||
ctx.strand,
|
||||
[&] () -> asio::awaitable<void> {
|
||||
co_await nano::async::sleep_for (100ms);
|
||||
},
|
||||
asio::bind_cancellation_slot (cancellation.slot (), asio::use_future));
|
||||
ASSERT_EQ (fut.wait_for (1s), std::future_status::ready);
|
||||
fut.get ();
|
||||
}
|
||||
auto cancel_fut = cancellation.emit ();
|
||||
ASSERT_EQ (cancel_fut.wait_for (1s), std::future_status::ready);
|
||||
}
|
||||
|
||||
TEST (async, task)
|
||||
{
|
||||
nano::test::system system;
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ class cancellation
|
|||
public:
|
||||
explicit cancellation (nano::async::strand & strand) :
|
||||
strand{ strand },
|
||||
signal{ std::make_unique<asio::cancellation_signal> () }
|
||||
signal{ std::make_shared<asio::cancellation_signal> () }
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -49,12 +49,11 @@ public:
|
|||
};
|
||||
|
||||
public:
|
||||
void emit (asio::cancellation_type type = asio::cancellation_type::all)
|
||||
auto emit (asio::cancellation_type type = asio::cancellation_type::all)
|
||||
{
|
||||
asio::dispatch (strand, asio::use_future ([this, type] () {
|
||||
signal->emit (type);
|
||||
}))
|
||||
.wait ();
|
||||
return asio::dispatch (strand, asio::use_future ([signal_l = signal, type] () {
|
||||
signal_l->emit (type);
|
||||
}));
|
||||
}
|
||||
|
||||
auto slot ()
|
||||
|
|
@ -67,9 +66,8 @@ public:
|
|||
nano::async::strand & strand;
|
||||
|
||||
private:
|
||||
std::unique_ptr<asio::cancellation_signal> signal; // Wrap the signal in a unique_ptr to enable moving
|
||||
|
||||
bool slotted{ false };
|
||||
std::shared_ptr<asio::cancellation_signal> signal;
|
||||
bool slotted{ false }; // For debugging purposes
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -82,7 +80,7 @@ public:
|
|||
// Only thread-like void tasks are supported for now
|
||||
using value_type = void;
|
||||
|
||||
task (nano::async::strand & strand) :
|
||||
explicit task (nano::async::strand & strand) :
|
||||
strand{ strand },
|
||||
cancellation{ strand }
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue