1
Fork 0

remove extra spinning from mpsc::Receiver::recv

This commit is contained in:
Ibraheem Ahmed 2022-10-17 19:17:10 -04:00
parent cb394c026a
commit 8c17a3e7cb
2 changed files with 6 additions and 26 deletions

View file

@ -378,22 +378,12 @@ impl<T> Channel<T> {
/// Receives a message from the channel. /// Receives a message from the channel.
pub(crate) fn recv(&self, deadline: Option<Instant>) -> Result<T, RecvTimeoutError> { pub(crate) fn recv(&self, deadline: Option<Instant>) -> Result<T, RecvTimeoutError> {
let token = &mut Token::default(); let token = &mut Token::default();
loop {
// Try receiving a message several times.
let backoff = Backoff::new();
loop { loop {
if self.start_recv(token) { if self.start_recv(token) {
let res = unsafe { self.read(token) }; let res = unsafe { self.read(token) };
return res.map_err(|_| RecvTimeoutError::Disconnected); return res.map_err(|_| RecvTimeoutError::Disconnected);
} }
if backoff.is_completed() {
break;
} else {
backoff.snooze();
}
}
if let Some(d) = deadline { if let Some(d) = deadline {
if Instant::now() >= d { if Instant::now() >= d {
return Err(RecvTimeoutError::Timeout); return Err(RecvTimeoutError::Timeout);

View file

@ -417,9 +417,6 @@ impl<T> Channel<T> {
/// Receives a message from the channel. /// Receives a message from the channel.
pub(crate) fn recv(&self, deadline: Option<Instant>) -> Result<T, RecvTimeoutError> { pub(crate) fn recv(&self, deadline: Option<Instant>) -> Result<T, RecvTimeoutError> {
let token = &mut Token::default(); let token = &mut Token::default();
loop {
// Try receiving a message several times.
let backoff = Backoff::new();
loop { loop {
if self.start_recv(token) { if self.start_recv(token) {
unsafe { unsafe {
@ -427,13 +424,6 @@ impl<T> Channel<T> {
} }
} }
if backoff.is_completed() {
break;
} else {
backoff.snooze();
}
}
if let Some(d) = deadline { if let Some(d) = deadline {
if Instant::now() >= d { if Instant::now() >= d {
return Err(RecvTimeoutError::Timeout); return Err(RecvTimeoutError::Timeout);