@@ -5,6 +5,7 @@ use postgres_protocol::message::frontend;
55use std:: collections:: { HashMap , VecDeque } ;
66use std:: io;
77use tokio_codec:: Framed ;
8+ use want:: Taker ;
89
910use error:: { self , Error } ;
1011use proto:: codec:: PostgresCodec ;
@@ -27,7 +28,8 @@ pub struct Connection {
2728 stream : Framed < Socket , PostgresCodec > ,
2829 cancel_data : CancelData ,
2930 parameters : HashMap < String , String > ,
30- receiver : mpsc:: Receiver < Request > ,
31+ receiver : mpsc:: UnboundedReceiver < Request > ,
32+ taker : Taker ,
3133 pending_request : Option < Vec < u8 > > ,
3234 pending_response : Option < Message > ,
3335 responses : VecDeque < mpsc:: Sender < Message > > ,
@@ -39,13 +41,15 @@ impl Connection {
3941 stream : Framed < Socket , PostgresCodec > ,
4042 cancel_data : CancelData ,
4143 parameters : HashMap < String , String > ,
42- receiver : mpsc:: Receiver < Request > ,
44+ receiver : mpsc:: UnboundedReceiver < Request > ,
45+ taker : Taker ,
4346 ) -> Connection {
4447 Connection {
4548 stream,
4649 cancel_data,
4750 parameters,
4851 receiver,
52+ taker,
4953 pending_request : None ,
5054 pending_response : None ,
5155 responses : VecDeque :: new ( ) ,
@@ -76,7 +80,10 @@ impl Connection {
7680 Async :: Ready ( None ) => {
7781 return Err ( Error :: from ( io:: Error :: from ( io:: ErrorKind :: UnexpectedEof ) ) ) ;
7882 }
79- Async :: NotReady => return Ok ( ( ) ) ,
83+ Async :: NotReady => {
84+ self . taker . want ( ) ;
85+ return Ok ( ( ) ) ;
86+ }
8087 } ;
8188
8289 let message = match message {
@@ -100,7 +107,7 @@ impl Connection {
100107 } ,
101108 } ;
102109
103- let ready = match message {
110+ let request_complete = match message {
104111 Message :: ReadyForQuery ( _) => true ,
105112 _ => false ,
106113 } ;
@@ -109,7 +116,7 @@ impl Connection {
109116 // if the receiver's hung up we still need to page through the rest of the messages
110117 // designated to it
111118 Ok ( AsyncSink :: Ready ) | Err ( _) => {
112- if !ready {
119+ if !request_complete {
113120 self . responses . push_front ( sender) ;
114121 }
115122 }
0 commit comments