@@ -6,10 +6,10 @@ use std::io;
66use std:: sync:: { Arc , Mutex } ;
77use std:: time:: { Duration , Instant } ;
88
9- /// An RpcServer that listen, accept, and server connections, according to ServerFactory interface.
9+ /// An RpcServer that listen, accept, and server connections, according to ServerFact interface.
1010pub struct RpcServer < F >
1111where
12- F : ServerFactory ,
12+ F : ServerFact ,
1313{
1414 listeners_abort : Vec < ( AbortHandle , String ) > ,
1515 logger : F :: Logger ,
2121
2222impl < F > RpcServer < F >
2323where
24- F : ServerFactory ,
24+ F : ServerFact ,
2525{
2626 pub fn new ( factory : Arc < F > ) -> Self {
2727 let ( tx, rx) = crossfire:: mpmc:: unbounded_async ( ) ;
3535 }
3636 }
3737
38- pub fn listen ( & mut self , addr : & str ) -> io:: Result < String > {
39- match << F :: Transport as ServerTransport < F > > :: Listener as AsyncListener >:: bind ( addr) {
38+ pub fn listen < T : ServerTransport < F :: IO > > ( & mut self , addr : & str ) -> io:: Result < String > {
39+ match <T :: Listener as AsyncListener >:: bind ( addr) {
4040 Err ( e) => {
4141 error ! ( "bind addr {:?} err: {}" , addr, e) ;
4242 return Err ( e) ;
@@ -68,12 +68,12 @@ where
6868 return ;
6969 }
7070 Ok ( stream) => {
71- let conn = F :: Transport :: new_conn (
71+ let conn = T :: new_conn (
7272 stream,
73- & factory,
73+ factory. get_config ( ) ,
7474 conn_ref_count. clone ( ) ,
7575 ) ;
76- Self :: server_conn ( conn, & factory, server_close_rx. clone ( ) )
76+ Self :: server_conn :: < T > ( conn, & factory, server_close_rx. clone ( ) )
7777 }
7878 }
7979 }
@@ -88,24 +88,34 @@ where
8888 }
8989 }
9090
91- fn server_conn ( conn : F :: Transport , factory : & F , server_close_rx : crossfire:: MAsyncRx < ( ) > ) {
91+ fn server_conn < T : ServerTransport < F :: IO > > (
92+ conn : T , factory : & F , server_close_rx : crossfire:: MAsyncRx < ( ) > ,
93+ ) {
9294 let conn = Arc :: new ( conn) ;
9395
9496 let dispatch = Arc :: new ( factory. new_dispatcher ( ) ) ;
9597 let ( done_tx, done_rx) = crossfire:: mpsc:: unbounded_async ( ) ;
9698
9799 let noti = RespNoti ( done_tx) ;
98- struct Reader < F : ServerFactory , D : ReqDispatch < R > , R : ServerTaskResp > {
100+ struct Reader <
101+ T : ServerTransport < F :: IO > ,
102+ F : ServerFact ,
103+ D : ReqDispatch < R > ,
104+ R : ServerTaskResp ,
105+ > {
99106 noti : RespNoti < R > ,
100- conn : Arc < F :: Transport > ,
107+ conn : Arc < T > ,
101108 server_close_rx : crossfire:: MAsyncRx < ( ) > ,
102109 dispatch : Arc < D > ,
110+ logger : F :: Logger ,
103111 }
104112
105- impl < F : ServerFactory , D : ReqDispatch < R > , R : ServerTaskResp > Reader < F , D , R > {
113+ impl < T : ServerTransport < F :: IO > , F : ServerFact , D : ReqDispatch < R > , R : ServerTaskResp >
114+ Reader < T , F , D , R >
115+ {
106116 async fn run ( self ) -> Result < ( ) , ( ) > {
107117 loop {
108- match self . conn . read_req ( & self . server_close_rx ) . await {
118+ match self . conn . read_req :: < F > ( & self . logger , & self . server_close_rx ) . await {
109119 Ok ( req) => {
110120 if req. action == RpcAction :: Num ( 0 ) && req. msg . len ( ) == 0 {
111121 // ping request
@@ -129,41 +139,52 @@ where
129139 #[ inline]
130140 fn send_quick_resp ( & self , seq : u64 , err : Option < RpcIntErr > ) -> Result < ( ) , ( ) > {
131141 if self . noti . send_err ( seq, err) . is_err ( ) {
132- logger_warn ! (
133- self . conn. get_logger( ) ,
134- "{:?} reader abort due to writer has err" ,
135- self . conn
136- ) ;
142+ logger_warn ! ( self . logger, "{:?} reader abort due to writer has err" , self . conn) ;
137143 return Err ( ( ) ) ;
138144 }
139145 Ok ( ( ) )
140146 }
141147 }
142- let reader = Reader :: < F , _ , _ > {
148+ let reader = Reader :: < T , F , _ , _ > {
143149 noti,
144150 conn : conn. clone ( ) ,
145151 server_close_rx,
146152 dispatch : dispatch. clone ( ) ,
153+ logger : factory. new_logger ( ) ,
147154 } ;
148155 factory. spawn_detach ( async move { reader. run ( ) . await } ) ;
149156
150- struct Writer < F : ServerFactory , D : ReqDispatch < R > , R : ServerTaskResp > {
157+ struct Writer <
158+ T : ServerTransport < F :: IO > ,
159+ F : ServerFact ,
160+ D : ReqDispatch < R > ,
161+ R : ServerTaskResp ,
162+ > {
151163 dispatch : Arc < D > ,
152164 done_rx : crossfire:: AsyncRx < Result < R , ( u64 , Option < RpcIntErr > ) > > ,
153- conn : Arc < F :: Transport > ,
165+ conn : Arc < T > ,
166+ logger : F :: Logger ,
154167 }
155168
156- impl < F : ServerFactory , D : ReqDispatch < R > , R : ServerTaskResp > Writer < F , D , R > {
169+ impl < T : ServerTransport < F :: IO > , F : ServerFact , D : ReqDispatch < R > , R : ServerTaskResp >
170+ Writer < T , F , D , R >
171+ {
157172 async fn run ( self ) -> Result < ( ) , io:: Error > {
158173 macro_rules! process {
159174 ( $task: expr) => { {
160175 match $task {
161176 Ok ( _task) => {
162- logger_trace!( self . conn. get_logger( ) , "write_resp {:?}" , _task) ;
163- self . conn. write_resp( self . dispatch. get_codec( ) , _task) . await ?;
177+ logger_trace!( self . logger, "write_resp {:?}" , _task) ;
178+ self . conn
179+ . write_resp:: <F , R >(
180+ & self . logger,
181+ self . dispatch. get_codec( ) ,
182+ _task,
183+ )
184+ . await ?;
164185 }
165186 Err ( ( seq, err) ) => {
166- self . conn. write_resp_internal( seq, err) . await ?;
187+ self . conn. write_resp_internal:: < F > ( & self . logger , seq, err) . await ?;
167188 }
168189 }
169190 } } ;
@@ -173,14 +194,14 @@ where
173194 while let Ok ( task) = self . done_rx . try_recv ( ) {
174195 process ! ( task) ;
175196 }
176- self . conn . flush_resp ( ) . await ?;
197+ self . conn . flush_resp :: < F > ( & self . logger ) . await ?;
177198 }
178- logger_trace ! ( self . conn . get_logger ( ) , "{:?} writer exits" , self . conn) ;
179- self . conn . close_conn ( ) . await ;
199+ logger_trace ! ( self . logger , "{:?} writer exits" , self . conn) ;
200+ self . conn . close_conn :: < F > ( & self . logger ) . await ;
180201 Ok ( ( ) )
181202 }
182203 }
183- let writer = Writer :: < F , _ , _ > { done_rx, conn, dispatch } ;
204+ let writer = Writer :: < T , F , _ , _ > { done_rx, conn, dispatch, logger : factory . new_logger ( ) } ;
184205 factory. spawn_detach ( async move { writer. run ( ) . await } ) ;
185206 }
186207
0 commit comments