34
34
{
35
35
reader : Option < BufReader < R > > ,
36
36
writer : Arc < Mutex < BufWriter < W > > > ,
37
- dispatch_guard : Option < JoinHandle < ( ) > > ,
37
+ dispatch_guard : Option < ( JoinHandle < ( ) > , JoinHandle < ( ) > ) > ,
38
38
event_loop_started : bool ,
39
39
queue : Queue ,
40
40
msgid_counter : u64 ,
45
45
R : Read + Send + ' static ,
46
46
W : Write + Send + ' static ,
47
47
{
48
- pub fn take_dispatch_guard ( & mut self ) -> JoinHandle < ( ) > {
48
+ pub fn take_dispatch_guard ( & mut self ) -> ( JoinHandle < ( ) > , JoinHandle < ( ) > ) {
49
49
self . dispatch_guard
50
50
. take ( )
51
51
. expect ( "Can only take join handle after running event loop" )
@@ -143,7 +143,7 @@ where
143
143
}
144
144
}
145
145
Err ( mpsc:: TryRecvError :: Disconnected ) => {
146
- return Err ( Value :: from ( format ! ( "Channel disconnected ({})" , method) ) )
146
+ return Err ( Value :: from ( format ! ( "Channel disconnected ({})" , method) ) ) ;
147
147
}
148
148
Ok ( val) => return val,
149
149
} ;
@@ -226,27 +226,19 @@ where
226
226
mut reader : BufReader < R > ,
227
227
writer : Arc < Mutex < BufWriter < W > > > ,
228
228
mut handler : H ,
229
- ) -> JoinHandle < ( ) >
229
+ ) -> ( JoinHandle < ( ) > , JoinHandle < ( ) > )
230
230
where
231
231
H : Handler + Send + ' static ,
232
232
{
233
- thread:: spawn ( move || loop {
234
- let msg = match model:: decode ( & mut reader) {
235
- Ok ( msg) => msg,
236
- Err ( e) => {
237
- error ! ( "Error while reading: {}" , e) ;
238
- Self :: send_error_to_callers ( & queue, & e) ;
239
- return ;
240
- }
241
- } ;
242
- debug ! ( "Get message {:?}" , msg) ;
243
- match msg {
244
- model:: RpcMessage :: RpcRequest {
233
+ let ( io_to_handlers, handlers_from_io) = mpsc:: channel ( ) ;
234
+ let rqjoin = thread:: spawn ( move || loop {
235
+ match handlers_from_io. recv ( ) {
236
+ Ok ( model:: RpcMessage :: RpcRequest {
245
237
msgid,
246
238
method,
247
239
params,
248
- } => {
249
- let response = match handler. handle_request ( & method, params) {
240
+ } ) => {
241
+ let response = match handler. handle_request ( method, params) {
250
242
Ok ( result) => model:: RpcMessage :: RpcResponse {
251
243
msgid,
252
244
result,
@@ -262,6 +254,31 @@ where
262
254
let writer = & mut * writer. lock ( ) . unwrap ( ) ;
263
255
model:: encode ( writer, response) . expect ( "Error sending RPC response" ) ;
264
256
}
257
+ Ok ( model:: RpcMessage :: RpcNotification { method, params } ) => {
258
+ handler. handle_notify ( & method, params) ;
259
+ }
260
+ Ok ( _) => {
261
+ error ! ( "Handler threat does not handle notifications!" ) ;
262
+ }
263
+ Err ( e) => {
264
+ debug ! ( "Error receiving request data: {:?}" , e) ;
265
+ }
266
+ }
267
+ } ) ;
268
+ let iojoin = thread:: spawn ( move || loop {
269
+ error ! ( "Beginning of io-loop!" ) ;
270
+ let msg = match model:: decode ( & mut reader) {
271
+ Ok ( msg) => msg,
272
+ Err ( e) => {
273
+ error ! ( "Error while reading: {}" , e) ;
274
+ Self :: send_error_to_callers ( & queue, & e) ;
275
+ return ;
276
+ }
277
+ } ;
278
+ match msg {
279
+ m @ model:: RpcMessage :: RpcRequest { .. } => {
280
+ io_to_handlers. send ( m) . unwrap ( ) ;
281
+ }
265
282
model:: RpcMessage :: RpcResponse {
266
283
msgid,
267
284
result,
@@ -274,11 +291,13 @@ where
274
291
sender. send ( Ok ( result) ) ;
275
292
}
276
293
}
277
- model:: RpcMessage :: RpcNotification { method, params } => {
278
- handler. handle_notify ( & method, params) ;
294
+ m @ model:: RpcMessage :: RpcNotification { .. } => {
295
+ io_to_handlers. send ( m) . unwrap ( ) ;
296
+ //handler.handle_notify(&method, params);
279
297
}
280
298
} ;
281
- } )
299
+ } ) ;
300
+ ( rqjoin, iojoin)
282
301
}
283
302
}
284
303
0 commit comments