about summary refs log tree commit diff
diff options
context:
space:
mode:
authorIbraheem Ahmed <ibraheem@ibraheem.ca>2022-10-17 19:30:48 -0400
committerIbraheem Ahmed <ibraheem@ibraheem.ca>2022-11-09 23:20:02 -0500
commit7b721ed0cd91c10fcdb9a81b6007b54d2df54a3f (patch)
tree7b53b4710f43bad5e457a262a839b06f2d585be7
parent8c17a3e7cb0717fbc849f2a8250e8f5b88a1a3c7 (diff)
downloadrust-7b721ed0cd91c10fcdb9a81b6007b54d2df54a3f.tar.gz
rust-7b721ed0cd91c10fcdb9a81b6007b54d2df54a3f.zip
`sync::mpsc`: reload state after spinning on CAS failure
-rw-r--r--library/std/src/sync/mpmc/array.rs6
-rw-r--r--library/std/src/sync/mpmc/list.rs10
2 files changed, 8 insertions, 8 deletions
diff --git a/library/std/src/sync/mpmc/array.rs b/library/std/src/sync/mpmc/array.rs
index dfa47702103..2d65bd27d86 100644
--- a/library/std/src/sync/mpmc/array.rs
+++ b/library/std/src/sync/mpmc/array.rs
@@ -167,9 +167,9 @@ impl<T> Channel<T> {
                         token.array.stamp = tail + 1;
                         return true;
                     }
-                    Err(t) => {
-                        tail = t;
+                    Err(_) => {
                         backoff.spin();
+                        tail = self.load(Ordering::Relaxed);
                     }
                 }
             } else if stamp.wrapping_add(self.one_lap) == tail + 1 {
@@ -251,8 +251,8 @@ impl<T> Channel<T> {
                         return true;
                     }
                     Err(h) => {
-                        head = h;
                         backoff.spin();
+                        head = self.head.load(Ordering::Relaxed);
                     }
                 }
             } else if stamp == head {
diff --git a/library/std/src/sync/mpmc/list.rs b/library/std/src/sync/mpmc/list.rs
index 4761125e483..22b6b1133ae 100644
--- a/library/std/src/sync/mpmc/list.rs
+++ b/library/std/src/sync/mpmc/list.rs
@@ -246,10 +246,10 @@ impl<T> Channel<T> {
                     token.list.offset = offset;
                     return true;
                 },
-                Err(t) => {
-                    tail = t;
-                    block = self.tail.block.load(Ordering::Acquire);
+                Err(_) => {
                     backoff.spin();
+                    tail = self.tail.index.load(Ordering::Acquire);
+                    block = self.tail.block.load(Ordering::Acquire);
                 }
             }
         }
@@ -351,9 +351,9 @@ impl<T> Channel<T> {
                     return true;
                 },
                 Err(h) => {
-                    head = h;
-                    block = self.head.block.load(Ordering::Acquire);
                     backoff.spin();
+                    head = self.head.index.load(Ordering::Acquire);
+                    block = self.head.block.load(Ordering::Acquire);
                 }
             }
         }