tlsclient/tlsserver: reregister to reflect current state

Each message might lead to potentially different IO interests.

This fixes a non-deterministic hang during tests.
This commit is contained in:
Joseph Birr-Pixton 2020-05-10 09:14:52 +01:00
parent cdd403fe98
commit ab9dc83d9b
2 changed files with 28 additions and 15 deletions

View File

@ -157,12 +157,16 @@ impl TlsClient {
self.tls_session.writev_tls(&mut WriteVAdapter::new(&mut self.socket)).unwrap(); self.tls_session.writev_tls(&mut WriteVAdapter::new(&mut self.socket)).unwrap();
} }
fn register(&mut self, poll: &mut mio::Poll) { fn register(&mut self, registry: &mio::Registry) {
let registry = poll.registry();
let interest = self.ready_interest(); let interest = self.ready_interest();
registry.register(&mut self.socket, CLIENT, interest).unwrap(); registry.register(&mut self.socket, CLIENT, interest).unwrap();
} }
fn reregister(&mut self, registry: &mio::Registry) {
let interest = self.ready_interest();
registry.reregister(&mut self.socket, CLIENT, interest).unwrap();
}
// Use wants_read/wants_write to register for different mio-level // Use wants_read/wants_write to register for different mio-level
// IO readiness events. // IO readiness events.
fn ready_interest(&self) -> mio::Interest { fn ready_interest(&self) -> mio::Interest {
@ -542,7 +546,7 @@ fn main() {
let mut poll = mio::Poll::new() let mut poll = mio::Poll::new()
.unwrap(); .unwrap();
let mut events = mio::Events::with_capacity(32); let mut events = mio::Events::with_capacity(32);
tlsclient.register(&mut poll); tlsclient.register(poll.registry());
loop { loop {
poll.poll(&mut events, None) poll.poll(&mut events, None)
@ -550,6 +554,7 @@ fn main() {
for ev in events.iter() { for ev in events.iter() {
tlsclient.ready(&ev); tlsclient.ready(&ev);
tlsclient.reregister(poll.registry());
} }
} }
} }

View File

@ -64,7 +64,7 @@ impl TlsServer {
} }
} }
fn accept(&mut self, poll: &mut mio::Poll) -> bool { fn accept(&mut self, registry: &mio::Registry) -> bool {
match self.server.accept() { match self.server.accept() {
Ok((socket, addr)) => { Ok((socket, addr)) => {
debug!("Accepting new connection from {:?}", addr); debug!("Accepting new connection from {:?}", addr);
@ -76,7 +76,7 @@ impl TlsServer {
self.next_id += 1; self.next_id += 1;
let mut connection = Connection::new(socket, token, mode, tls_session); let mut connection = Connection::new(socket, token, mode, tls_session);
connection.register(poll); connection.register(registry);
self.connections.insert(token, connection); self.connections.insert(token, connection);
true true
} }
@ -87,14 +87,14 @@ impl TlsServer {
} }
} }
fn conn_event(&mut self, poll: &mut mio::Poll, event: &mio::event::Event) { fn conn_event(&mut self, registry: &mio::Registry, event: &mio::event::Event) {
let token = event.token(); let token = event.token();
if self.connections.contains_key(&token) { if self.connections.contains_key(&token) {
self.connections self.connections
.get_mut(&token) .get_mut(&token)
.unwrap() .unwrap()
.ready(poll, event); .ready(registry, event);
if self.connections[&token].is_closed() { if self.connections[&token].is_closed() {
self.connections.remove(&token); self.connections.remove(&token);
@ -166,7 +166,7 @@ impl Connection {
} }
/// We're a connection, and we have something to do. /// We're a connection, and we have something to do.
fn ready(&mut self, poll: &mut mio::Poll, ev: &mio::event::Event) { fn ready(&mut self, registry: &mio::Registry, ev: &mio::event::Event) {
// If we're readable: read some TLS. Then // If we're readable: read some TLS. Then
// see if that yielded new plaintext. Then // see if that yielded new plaintext. Then
// see if the backend is readable too. // see if the backend is readable too.
@ -184,7 +184,9 @@ impl Connection {
let _ = self.socket.shutdown(net::Shutdown::Both); let _ = self.socket.shutdown(net::Shutdown::Both);
self.close_back(); self.close_back();
self.closed = true; self.closed = true;
self.deregister(poll); self.deregister(registry);
} else {
self.reregister(registry);
} }
} }
@ -326,8 +328,7 @@ impl Connection {
} }
} }
fn register(&mut self, poll: &mut mio::Poll) { fn register(&mut self, registry: &mio::Registry) {
let registry = poll.registry();
let event_set = self.event_set(); let event_set = self.event_set();
registry.register(&mut self.socket, registry.register(&mut self.socket,
self.token, self.token,
@ -342,8 +343,15 @@ impl Connection {
} }
} }
fn deregister(&mut self, poll: &mut mio::Poll) { fn reregister(&mut self, registry: &mio::Registry) {
let registry = poll.registry(); let event_set = self.event_set();
registry.reregister(&mut self.socket,
self.token,
event_set)
.unwrap();
}
fn deregister(&mut self, registry: &mio::Registry) {
registry.deregister(&mut self.socket) registry.deregister(&mut self.socket)
.unwrap(); .unwrap();
@ -627,11 +635,11 @@ fn main() {
for event in events.iter() { for event in events.iter() {
match event.token() { match event.token() {
LISTENER => { LISTENER => {
if !tlsserv.accept(&mut poll) { if !tlsserv.accept(poll.registry()) {
break; break;
} }
} }
_ => tlsserv.conn_event(&mut poll, &event) _ => tlsserv.conn_event(poll.registry(), &event)
} }
} }
} }