Misc bug fixes related to stream state (#273)
This patch includes two new significant debug assertions: * Assert stream counts are zero when the connection finalizes. * Assert all stream state has been released when the connection is dropped. These two assertions were added in an effort to test the fix provided by #261. In doing so, many related bugs have been discovered and fixed. The details related to these bugs can be found in #273.
This commit is contained in:
@@ -178,7 +178,6 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Advances the internal state of the connection.
|
||||
pub fn poll(&mut self) -> Poll<(), proto::Error> {
|
||||
use codec::RecvError::*;
|
||||
@@ -341,7 +340,8 @@ where
|
||||
},
|
||||
None => {
|
||||
trace!("codec closed");
|
||||
self.streams.recv_eof();
|
||||
self.streams.recv_eof(false)
|
||||
.ok().expect("mutex poisoned");
|
||||
return Ok(Async::Ready(()));
|
||||
},
|
||||
}
|
||||
@@ -397,3 +397,14 @@ where
|
||||
self.ping_pong.ping_shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, P, B> Drop for Connection<T, P, B>
|
||||
where
|
||||
P: Peer,
|
||||
B: IntoBuf,
|
||||
{
|
||||
fn drop(&mut self) {
|
||||
// Ignore errors as this indicates that the mutex is poisoned.
|
||||
let _ = self.streams.recv_eof(true);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user