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