mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-09 00:00:08 +02:00
Make Barrier::wait future Send (#1611)
It wasn't before. Now it is. And that is better.
This commit is contained in:
@@ -83,6 +83,9 @@ impl Barrier {
|
|||||||
// deadlock even if another future is concurrently holding the lock.
|
// deadlock even if another future is concurrently holding the lock.
|
||||||
// It is _desireable_ to do so as synchronous Mutexes are, at least in theory, faster than
|
// It is _desireable_ to do so as synchronous Mutexes are, at least in theory, faster than
|
||||||
// the asynchronous counter-parts, so we should use them where possible [citation needed].
|
// the asynchronous counter-parts, so we should use them where possible [citation needed].
|
||||||
|
// NOTE: the extra scope here is so that the compiler doesn't think `state` is held across
|
||||||
|
// a yield point, and thus marks the returned future as !Send.
|
||||||
|
let generation = {
|
||||||
let mut state = self.state.lock().unwrap();
|
let mut state = self.state.lock().unwrap();
|
||||||
let generation = state.generation;
|
let generation = state.generation;
|
||||||
state.arrived += 1;
|
state.arrived += 1;
|
||||||
@@ -98,7 +101,8 @@ impl Barrier {
|
|||||||
return BarrierWaitResult(true);
|
return BarrierWaitResult(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
drop(state);
|
generation
|
||||||
|
};
|
||||||
|
|
||||||
// we're going to have to wait for the last of the generation to arrive
|
// we're going to have to wait for the last of the generation to arrive
|
||||||
let mut wait = self.wait.clone();
|
let mut wait = self.wait.clone();
|
||||||
|
|||||||
@@ -4,6 +4,13 @@ use tokio_sync::Barrier;
|
|||||||
use tokio_test::task::spawn;
|
use tokio_test::task::spawn;
|
||||||
use tokio_test::{assert_pending, assert_ready};
|
use tokio_test::{assert_pending, assert_ready};
|
||||||
|
|
||||||
|
struct IsSend<T: Send>(T);
|
||||||
|
#[test]
|
||||||
|
fn barrier_future_is_send() {
|
||||||
|
let b = Barrier::new(0);
|
||||||
|
IsSend(b.wait());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn zero_does_not_block() {
|
fn zero_does_not_block() {
|
||||||
let b = Barrier::new(0);
|
let b = Barrier::new(0);
|
||||||
|
|||||||
Reference in New Issue
Block a user