11use std:: {
2- collections:: { HashMap , VecDeque } ,
2+ collections:: VecDeque ,
33 io,
44 net:: { IpAddr , SocketAddr } ,
55 pin:: { pin, Pin } ,
@@ -21,6 +21,7 @@ use quinn_proto::{
2121 congestion:: Controller , crypto:: rustls:: HandshakeData , ConnectionHandle , ConnectionStats , Dir ,
2222 EndpointEvent , StreamEvent , StreamId , VarInt ,
2323} ;
24+ use rustc_hash:: FxHashMap as HashMap ;
2425use thiserror:: Error ;
2526
2627use crate :: { RecvStream , SendStream , Socket } ;
@@ -37,7 +38,7 @@ pub(crate) struct ConnectionState {
3738 pub ( crate ) error : Option < ConnectionError > ,
3839 connected : bool ,
3940 worker : Option < JoinHandle < ( ) > > ,
40- poll_waker : Option < Waker > ,
41+ poller : Option < Waker > ,
4142 on_connected : Option < Waker > ,
4243 on_handshake_data : Option < Waker > ,
4344 datagram_received : VecDeque < Waker > ,
@@ -73,8 +74,14 @@ impl ConnectionState {
7374 wake_all_streams ( & mut self . stopped ) ;
7475 }
7576
77+ fn close ( & mut self , error_code : VarInt , reason : Bytes ) {
78+ self . conn . close ( Instant :: now ( ) , error_code, reason) ;
79+ self . terminate ( ConnectionError :: LocallyClosed ) ;
80+ self . wake ( ) ;
81+ }
82+
7683 pub ( crate ) fn wake ( & mut self ) {
77- if let Some ( waker) = self . poll_waker . take ( ) {
84+ if let Some ( waker) = self . poller . take ( ) {
7885 waker. wake ( )
7986 }
8087 }
@@ -110,6 +117,12 @@ pub(crate) struct ConnectionInner {
110117 events_rx : Receiver < ConnectionEvent > ,
111118}
112119
120+ fn implicit_close ( this : & Arc < ConnectionInner > ) {
121+ if Arc :: strong_count ( this) == 2 {
122+ this. state ( ) . close ( 0u32 . into ( ) , Bytes :: new ( ) )
123+ }
124+ }
125+
113126impl ConnectionInner {
114127 fn new (
115128 handle : ConnectionHandle ,
@@ -124,16 +137,16 @@ impl ConnectionInner {
124137 connected : false ,
125138 error : None ,
126139 worker : None ,
127- poll_waker : None ,
140+ poller : None ,
128141 on_connected : None ,
129142 on_handshake_data : None ,
130143 datagram_received : VecDeque :: new ( ) ,
131144 datagrams_unblocked : VecDeque :: new ( ) ,
132145 stream_opened : [ VecDeque :: new ( ) , VecDeque :: new ( ) ] ,
133146 stream_available : [ VecDeque :: new ( ) , VecDeque :: new ( ) ] ,
134- writable : HashMap :: new ( ) ,
135- readable : HashMap :: new ( ) ,
136- stopped : HashMap :: new ( ) ,
147+ writable : HashMap :: default ( ) ,
148+ readable : HashMap :: default ( ) ,
149+ stopped : HashMap :: default ( ) ,
137150 } ) ,
138151 handle,
139152 socket,
@@ -157,25 +170,13 @@ impl ConnectionInner {
157170 }
158171 }
159172
160- fn close ( & self , error_code : VarInt , reason : Bytes ) {
161- let mut state = self . state ( ) ;
162- state. conn . close ( Instant :: now ( ) , error_code, reason) ;
163- state. terminate ( ConnectionError :: LocallyClosed ) ;
164- state. wake ( ) ;
165- }
166-
167- async fn run ( & self ) -> io:: Result < ( ) > {
168- let mut send_buf = Some ( Vec :: with_capacity ( self . state ( ) . conn . current_mtu ( ) as usize ) ) ;
169- let mut transmit_fut = pin ! ( Fuse :: terminated( ) ) ;
170-
171- let mut timer = Timer :: new ( ) ;
172-
173+ async fn run ( self : & Arc < Self > ) -> io:: Result < ( ) > {
173174 let mut poller = stream:: poll_fn ( |cx| {
174175 let mut state = self . state ( ) ;
175- let ready = state. poll_waker . is_none ( ) ;
176- match & state. poll_waker {
176+ let ready = state. poller . is_none ( ) ;
177+ match & state. poller {
177178 Some ( waker) if waker. will_wake ( cx. waker ( ) ) => { }
178- _ => state. poll_waker = Some ( cx. waker ( ) . clone ( ) ) ,
179+ _ => state. poller = Some ( cx. waker ( ) . clone ( ) ) ,
179180 } ;
180181 if ready {
181182 Poll :: Ready ( Some ( ( ) ) )
@@ -185,36 +186,46 @@ impl ConnectionInner {
185186 } )
186187 . fuse ( ) ;
187188
189+ let mut timer = Timer :: new ( ) ;
190+ let mut event_stream = self . events_rx . stream ( ) . ready_chunks ( 100 ) ;
191+ let mut send_buf = Some ( Vec :: with_capacity ( self . state ( ) . conn . current_mtu ( ) as usize ) ) ;
192+ let mut transmit_fut = pin ! ( Fuse :: terminated( ) ) ;
193+
188194 loop {
189- select ! {
190- _ = poller. next ( ) => { }
195+ let mut state = select ! {
196+ _ = poller. select_next_some ( ) => self . state ( ) ,
191197 _ = timer => {
192- self . state( ) . conn. handle_timeout( Instant :: now( ) ) ;
193198 timer. reset( None ) ;
199+ let mut state = self . state( ) ;
200+ state. conn. handle_timeout( Instant :: now( ) ) ;
201+ state
194202 }
195- ev = self . events_rx. recv_async( ) => match ev {
196- Ok ( ConnectionEvent :: Close ( error_code, reason) ) => self . close( error_code, reason) ,
197- Ok ( ConnectionEvent :: Proto ( ev) ) => self . state( ) . conn. handle_event( ev) ,
198- Err ( _) => unreachable!( "endpoint dropped connection" ) ,
203+ events = event_stream. select_next_some( ) => {
204+ let mut state = self . state( ) ;
205+ for event in events {
206+ match event {
207+ ConnectionEvent :: Close ( error_code, reason) => state. close( error_code, reason) ,
208+ ConnectionEvent :: Proto ( event) => state. conn. handle_event( event) ,
209+ }
210+ }
211+ state
199212 } ,
200213 BufResult :: <( ) , Vec <u8 >>( res, mut buf) = transmit_fut => match res {
201214 Ok ( ( ) ) => {
202215 buf. clear( ) ;
203216 send_buf = Some ( buf) ;
217+ self . state( )
204218 } ,
205219 Err ( e) => break Err ( e) ,
206220 } ,
207- }
208-
209- let now = Instant :: now ( ) ;
210- let mut state = self . state ( ) ;
221+ } ;
211222
212223 if let Some ( mut buf) = send_buf. take ( ) {
213- if let Some ( transmit) =
214- state
215- . conn
216- . poll_transmit ( now , self . socket . max_gso_segments ( ) , & mut buf)
217- {
224+ if let Some ( transmit) = state . conn . poll_transmit (
225+ Instant :: now ( ) ,
226+ self . socket . max_gso_segments ( ) ,
227+ & mut buf,
228+ ) {
218229 transmit_fut. set ( async move { self . socket . send ( buf, & transmit) . await } . fuse ( ) )
219230 } else {
220231 send_buf = Some ( buf) ;
@@ -480,9 +491,7 @@ impl Future for Connecting {
480491
481492impl Drop for Connecting {
482493 fn drop ( & mut self ) {
483- if Arc :: strong_count ( & self . 0 ) == 2 {
484- self . 0 . close ( 0u32 . into ( ) , Bytes :: new ( ) )
485- }
494+ implicit_close ( & self . 0 )
486495 }
487496}
488497
@@ -593,7 +602,9 @@ impl Connection {
593602 /// [`Endpoint::shutdown()`]: crate::Endpoint::shutdown
594603 /// [`close()`]: Connection::close
595604 pub fn close ( & self , error_code : VarInt , reason : & [ u8 ] ) {
596- self . 0 . close ( error_code, Bytes :: copy_from_slice ( reason) ) ;
605+ self . 0
606+ . state ( )
607+ . close ( error_code, Bytes :: copy_from_slice ( reason) ) ;
597608 }
598609
599610 /// Wait for the connection to be closed for any reason.
@@ -838,9 +849,7 @@ impl Eq for Connection {}
838849
839850impl Drop for Connection {
840851 fn drop ( & mut self ) {
841- if Arc :: strong_count ( & self . 0 ) == 2 {
842- self . close ( 0u32 . into ( ) , b"" )
843- }
852+ implicit_close ( & self . 0 )
844853 }
845854}
846855
0 commit comments