mirror of https://github.com/ctz/rustls
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:
parent
cdd403fe98
commit
ab9dc83d9b
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue