Skip to content

Commit

Permalink
auto merge of rust-lang#12352 : alexcrichton/rust/fix-master, r=brson
Browse files Browse the repository at this point in the history
This deadlock was caused when the channel was closed at just the right time, so
the extra `self.cnt.fetch_add` actually should have preserved the DISCONNECTED
state of the channel. by modifying this the channel entered a state such that
the port would never succeed in dropping.

This also moves the increment of self.steals until after the MAX_STEALS block.
The reason for this is that in 'fn recv()' the steals variable is decremented
immediately after the try_recv(), which could in theory set steals to -1 if it
was previously set to 0 in try_recv().

Closes rust-lang#12340
  • Loading branch information
bors committed Feb 17, 2014
2 parents 47c3183 + 9c05c1c commit 5736deb
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/libstd/comm/shared.rs
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,6 @@ impl<T: Send> Packet<T> {
// See the discussion in the stream implementation for why we we
// might decrement steals.
Some(data) => {
self.steals += 1;
if self.steals > MAX_STEALS {
match self.cnt.swap(0, atomics::SeqCst) {
DISCONNECTED => {
Expand All @@ -314,11 +313,12 @@ impl<T: Send> Packet<T> {
n => {
let m = cmp::min(n, self.steals);
self.steals -= m;
self.cnt.fetch_add(n - m, atomics::SeqCst);
self.bump(n - m);
}
}
assert!(self.steals >= 0);
}
self.steals += 1;
Ok(data)
}

Expand Down
4 changes: 2 additions & 2 deletions src/libstd/comm/stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,6 @@ impl<T: Send> Packet<T> {
// down as much as possible (without going negative), and then
// adding back in whatever we couldn't factor into steals.
Some(data) => {
self.steals += 1;
if self.steals > MAX_STEALS {
match self.cnt.swap(0, atomics::SeqCst) {
DISCONNECTED => {
Expand All @@ -222,11 +221,12 @@ impl<T: Send> Packet<T> {
n => {
let m = cmp::min(n, self.steals);
self.steals -= m;
self.cnt.fetch_add(n - m, atomics::SeqCst);
self.bump(n - m);
}
}
assert!(self.steals >= 0);
}
self.steals += 1;
match data {
Data(t) => Ok(t),
GoUp(up) => Err(Upgraded(up)),
Expand Down

0 comments on commit 5736deb

Please sign in to comment.