Don't call the handler after it has shut down (#985)

This commit is contained in:
Pierre Krieger
2019-03-01 11:45:33 +01:00
committed by GitHub
parent b1d55cc7cd
commit a64b18d5ab

View File

@ -209,11 +209,14 @@ where
&mut self.handler
}
/// Injects an event to the handler.
/// Injects an event to the handler. Has no effect if the handler has already shut down,
/// either by itself or after `shutdown()` has been called.
#[inline]
pub fn inject_event(&mut self, event: THandler::InEvent) {
if !self.handler_is_done {
self.handler.inject_event(event);
}
}
/// Returns `true` if the remote has shown any sign of activity after the muxer has been open.
///
@ -253,7 +256,9 @@ where
for user_data in self.node.get_mut().cancel_outgoing() {
self.handler.inject_outbound_closed(user_data);
}
if !self.handler_is_done {
self.handler.shutdown();
}
self.is_shutting_down = true;
}
}
@ -277,25 +282,35 @@ where
match self.node.poll().map_err(HandledNodeError::Node)? {
Async::NotReady => node_not_ready = true,
Async::Ready(Some(NodeEvent::InboundSubstream { substream })) => {
if !self.handler_is_done {
self.handler.inject_substream(substream, NodeHandlerEndpoint::Listener)
}
}
Async::Ready(Some(NodeEvent::OutboundSubstream { user_data, substream })) => {
let endpoint = NodeHandlerEndpoint::Dialer(user_data);
if !self.handler_is_done {
self.handler.inject_substream(substream, endpoint)
}
}
Async::Ready(None) => {
if !self.is_shutting_down {
self.is_shutting_down = true;
if !self.handler_is_done {
self.handler.shutdown()
}
}
}
Async::Ready(Some(NodeEvent::OutboundClosed { user_data })) => {
if !self.handler_is_done {
self.handler.inject_outbound_closed(user_data)
}
}
Async::Ready(Some(NodeEvent::InboundClosed)) => {
if !self.handler_is_done {
self.handler.inject_inbound_closed()
}
}
}
match if self.handler_is_done { Async::Ready(NodeHandlerEvent::Shutdown) } else { self.handler.poll().map_err(HandledNodeError::Handler)? } {
Async::NotReady => {