@@ -10,21 +10,21 @@ use std::os::unix::io::RawFd;
1010use std:: sync:: Arc ;
1111
1212use crate :: asynchronous:: stream:: { receive, respond, respond_with_status} ;
13+ use crate :: asynchronous:: unix_incoming:: UnixIncoming ;
1314use crate :: common:: { self , Domain , MESSAGE_TYPE_REQUEST } ;
1415use crate :: error:: { get_status, Error , Result } ;
1516use crate :: r#async:: { MethodHandler , TtrpcContext } ;
1617use crate :: ttrpc:: { Code , Request } ;
1718use crate :: MessageHeader ;
19+ use futures:: stream:: Stream ;
1820use futures:: StreamExt as _;
1921use std:: marker:: Unpin ;
2022use std:: os:: unix:: io:: { AsRawFd , FromRawFd } ;
2123use std:: os:: unix:: net:: UnixListener as SysUnixListener ;
2224use tokio:: {
2325 self ,
24- io:: split,
26+ io:: { split, AsyncRead , AsyncWrite , AsyncWriteExt } ,
2527 net:: UnixListener ,
26- prelude:: * ,
27- stream:: Stream ,
2828 sync:: mpsc:: { channel, Receiver , Sender } ,
2929 sync:: watch,
3030} ;
@@ -116,9 +116,15 @@ impl Server {
116116 unsafe {
117117 sys_unix_listener = SysUnixListener :: from_raw_fd ( listenfd) ;
118118 }
119- let unix_listener = UnixListener :: from_std ( sys_unix_listener) . unwrap ( ) ;
119+ sys_unix_listener
120+ . set_nonblocking ( true )
121+ . map_err ( err_to_others_err ! ( e, "set_nonblocking error " ) ) ?;
122+ let unix_listener = UnixListener :: from_std ( sys_unix_listener)
123+ . map_err ( err_to_others_err ! ( e, "from_std error " ) ) ?;
120124
121- self . do_start ( listenfd, unix_listener) . await
125+ let incoming = UnixIncoming :: new ( unix_listener) ;
126+
127+ self . do_start ( listenfd, incoming) . await
122128 }
123129 Some ( Domain :: Vsock ) => {
124130 let incoming;
@@ -201,10 +207,10 @@ impl Server {
201207 }
202208 }
203209 }
204- v = close_conn_rx. recv ( ) => {
210+ v = close_conn_rx. changed ( ) => {
205211 // 0 is the init value of this watch, not a valid signal
206- // is_none means the tx was dropped.
207- if v. is_none ( ) || v . unwrap ( ) != 0 {
212+ // is_err means the tx was dropped.
213+ if v. is_err ( ) || * close_conn_rx . borrow ( ) != 0 {
208214 info!( "Stop accepting new connections." ) ;
209215 break ;
210216 }
@@ -227,7 +233,7 @@ impl Server {
227233 }
228234 }
229235 fd_tx = stop_listen_rx. recv( ) => {
230- if let Some ( mut fd_tx) = fd_tx {
236+ if let Some ( fd_tx) = fd_tx {
231237 // dup fd to keep the listener open
232238 // or the listener will be closed when the incoming was dropped.
233239 let dup_fd = unistd:: dup( incoming. as_raw_fd( ) ) . unwrap( ) ;
@@ -254,7 +260,7 @@ impl Server {
254260
255261 pub async fn disconnect ( & mut self ) {
256262 if let Some ( tx) = self . disconnect_tx . take ( ) {
257- tx. broadcast ( 1 ) . ok ( ) ;
263+ tx. send ( 1 ) . ok ( ) ;
258264 }
259265
260266 if let Some ( mut rx) = self . all_conn_done_rx . take ( ) {
@@ -263,7 +269,7 @@ impl Server {
263269 }
264270
265271 pub async fn stop_listen ( & mut self ) {
266- if let Some ( mut tx) = self . stop_listen_tx . take ( ) {
272+ if let Some ( tx) = self . stop_listen_tx . take ( ) {
267273 let ( fd_tx, mut fd_rx) = channel ( 1 ) ;
268274 tx. send ( fd_tx) . await . unwrap ( ) ;
269275
0 commit comments