]> git.lizzy.rs Git - rust.git/commitdiff
remove optimistic spinning from `mpsc::SyncSender`
authorIbraheem Ahmed <ibraheem@ibraheem.ca>
Sat, 14 Jan 2023 05:29:48 +0000 (00:29 -0500)
committerIbraheem Ahmed <ibraheem@ibraheem.ca>
Sat, 14 Jan 2023 05:36:51 +0000 (00:36 -0500)
library/std/src/sync/mpmc/array.rs
library/std/src/sync/mpmc/utils.rs

index c1e3e48b04468c8c501d45392b3c06b35fa34ac8..c6bb09b0417f3c918fd06b2b3a377b9829d2f592 100644 (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);
index cfe42750d5239a6a46ab629027581df795c12129..d053d69e26eeeb819c9da040bf8141870fc914b1 100644 (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
-    }
 }