diff options
| author | Ibraheem Ahmed <ibraheem@ibraheem.ca> | 2022-10-17 19:30:48 -0400 |
|---|---|---|
| committer | Ibraheem Ahmed <ibraheem@ibraheem.ca> | 2022-11-09 23:20:02 -0500 |
| commit | 7b721ed0cd91c10fcdb9a81b6007b54d2df54a3f (patch) | |
| tree | 7b53b4710f43bad5e457a262a839b06f2d585be7 | |
| parent | 8c17a3e7cb0717fbc849f2a8250e8f5b88a1a3c7 (diff) | |
| download | rust-7b721ed0cd91c10fcdb9a81b6007b54d2df54a3f.tar.gz rust-7b721ed0cd91c10fcdb9a81b6007b54d2df54a3f.zip | |
`sync::mpsc`: reload state after spinning on CAS failure
| -rw-r--r-- | library/std/src/sync/mpmc/array.rs | 6 | ||||
| -rw-r--r-- | library/std/src/sync/mpmc/list.rs | 10 |
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); } } } |
