mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-25 15:51:34 +00:00
Fix polling in handled_node.rs (#531)
This commit is contained in:
@ -195,46 +195,44 @@ where
|
||||
type Error = IoError;
|
||||
|
||||
fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
|
||||
// We extract the value from `self.node` and put it back in place if `NotReady`.
|
||||
if let Some(mut node) = self.node.take() {
|
||||
loop {
|
||||
match node.poll() {
|
||||
Ok(Async::NotReady) => {
|
||||
self.node = Some(node);
|
||||
break;
|
||||
},
|
||||
Ok(Async::Ready(Some(NodeEvent::InboundSubstream { substream }))) => {
|
||||
self.handler.inject_substream(substream, NodeHandlerEndpoint::Listener);
|
||||
},
|
||||
Ok(Async::Ready(Some(NodeEvent::OutboundSubstream { user_data, substream }))) => {
|
||||
let endpoint = NodeHandlerEndpoint::Dialer(user_data);
|
||||
self.handler.inject_substream(substream, endpoint);
|
||||
},
|
||||
Ok(Async::Ready(None)) => {
|
||||
// Breaking from the loop without putting back the node.
|
||||
self.handler.shutdown();
|
||||
break;
|
||||
},
|
||||
Ok(Async::Ready(Some(NodeEvent::Multiaddr(result)))) => {
|
||||
self.handler.inject_multiaddr(result);
|
||||
},
|
||||
Ok(Async::Ready(Some(NodeEvent::OutboundClosed { user_data }))) => {
|
||||
self.handler.inject_outbound_closed(user_data);
|
||||
},
|
||||
Ok(Async::Ready(Some(NodeEvent::InboundClosed))) => {
|
||||
self.handler.inject_inbound_closed();
|
||||
},
|
||||
Err(err) => {
|
||||
// Breaking from the loop without putting back the node.
|
||||
return Err(err);
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loop {
|
||||
let mut node_not_ready = false;
|
||||
|
||||
match self.node.as_mut().map(|n| n.poll()) {
|
||||
Some(Ok(Async::NotReady)) | None => {},
|
||||
Some(Ok(Async::Ready(Some(NodeEvent::InboundSubstream { substream })))) => {
|
||||
self.handler.inject_substream(substream, NodeHandlerEndpoint::Listener);
|
||||
},
|
||||
Some(Ok(Async::Ready(Some(NodeEvent::OutboundSubstream { user_data, substream })))) => {
|
||||
let endpoint = NodeHandlerEndpoint::Dialer(user_data);
|
||||
self.handler.inject_substream(substream, endpoint);
|
||||
},
|
||||
Some(Ok(Async::Ready(None))) => {
|
||||
node_not_ready = true;
|
||||
self.node = None;
|
||||
self.handler.shutdown();
|
||||
},
|
||||
Some(Ok(Async::Ready(Some(NodeEvent::Multiaddr(result))))) => {
|
||||
self.handler.inject_multiaddr(result);
|
||||
},
|
||||
Some(Ok(Async::Ready(Some(NodeEvent::OutboundClosed { user_data })))) => {
|
||||
self.handler.inject_outbound_closed(user_data);
|
||||
},
|
||||
Some(Ok(Async::Ready(Some(NodeEvent::InboundClosed)))) => {
|
||||
self.handler.inject_inbound_closed();
|
||||
},
|
||||
Some(Err(err)) => {
|
||||
self.node = None;
|
||||
return Err(err);
|
||||
},
|
||||
}
|
||||
|
||||
match self.handler.poll() {
|
||||
Ok(Async::NotReady) => break,
|
||||
Ok(Async::NotReady) => {
|
||||
if node_not_ready {
|
||||
break;
|
||||
}
|
||||
},
|
||||
Ok(Async::Ready(Some(NodeHandlerEvent::OutboundSubstreamRequest(user_data)))) => {
|
||||
if let Some(node) = self.node.as_mut() {
|
||||
match node.open_substream(user_data) {
|
||||
@ -264,7 +262,7 @@ where
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use futures::{future, task};
|
||||
use futures::future;
|
||||
use muxing::StreamMuxer;
|
||||
use tokio::runtime::current_thread;
|
||||
|
||||
|
Reference in New Issue
Block a user