remove optimistic spinning from mpsc::SyncSender

This commit is contained in:
Ibraheem Ahmed 2023-01-14 00:29:48 -05:00
parent ca5d92d789
commit ab20f8d5ba
2 changed files with 7 additions and 23 deletions

View File

@ -319,19 +319,10 @@ pub(crate) fn send(
) -> Result<(), SendTimeoutError<T>> {
let token = &mut Token::default();
loop {
// Try sending a message several times.
let backoff = Backoff::new();
loop {
if self.start_send(token) {
let res = unsafe { self.write(token, msg) };
return res.map_err(SendTimeoutError::Disconnected);
}
if backoff.is_completed() {
break;
} else {
backoff.spin_light();
}
// Try sending a message.
if self.start_send(token) {
let res = unsafe { self.write(token, msg) };
return res.map_err(SendTimeoutError::Disconnected);
}
if let Some(d) = deadline {
@ -379,6 +370,7 @@ pub(crate) fn try_recv(&self) -> Result<T, TryRecvError> {
pub(crate) fn recv(&self, deadline: Option<Instant>) -> Result<T, RecvTimeoutError> {
let token = &mut Token::default();
loop {
// Try receiving a message.
if self.start_recv(token) {
let res = unsafe { self.read(token) };
return res.map_err(|_| RecvTimeoutError::Disconnected);

View File

@ -105,10 +105,8 @@ pub fn new() -> Self {
/// Backs off using lightweight spinning.
///
/// This method should be used for:
/// - Retrying an operation because another thread made progress. i.e. on CAS failure.
/// - Waiting for an operation to complete by spinning optimistically for a few iterations
/// before falling back to parking the thread (see `Backoff::is_completed`).
/// This method should be used for retrying an operation because another thread made
/// progress. i.e. on CAS failure.
#[inline]
pub fn spin_light(&self) {
let step = self.step.get().min(SPIN_LIMIT);
@ -134,10 +132,4 @@ pub fn spin_heavy(&self) {
self.step.set(self.step.get() + 1);
}
/// Returns `true` if quadratic backoff has completed and parking the thread is advised.
#[inline]
pub fn is_completed(&self) -> bool {
self.step.get() > SPIN_LIMIT
}
}