1
1
use std:: collections:: VecDeque ;
2
- use std:: { cell, future:: Future , marker, pin:: Pin , rc:: Rc , task:: Context , task:: Poll } ;
2
+ use std:: {
3
+ cell, future:: poll_fn, future:: Future , marker, pin:: Pin , rc:: Rc , task:: Context , task:: Poll ,
4
+ } ;
3
5
4
- use ntex:: service:: { Pipeline , PipelineCall , Service , ServiceCtx } ;
6
+ use ntex:: service:: { Pipeline , PipelineBinding , PipelineCall , Service , ServiceCtx } ;
5
7
use ntex:: time:: { sleep, Millis , Sleep } ;
6
- use ntex:: util:: { ready, BoxFuture , Either } ;
8
+ use ntex:: util:: { ready, Either } ;
7
9
use ntex:: { io:: DispatchItem , rt:: spawn, task:: LocalWaker } ;
8
10
9
11
use crate :: codec:: { protocol:: Frame , AmqpCodec , AmqpFrame } ;
@@ -24,13 +26,12 @@ impl ControlQueue {
24
26
}
25
27
26
28
/// Amqp server dispatcher service.
27
- pub ( crate ) struct Dispatcher < Sr , Ctl : Service < ControlFrame > > {
29
+ pub ( crate ) struct Dispatcher < Sr : Service < types :: Message > , Ctl : Service < ControlFrame > > {
28
30
sink : Connection ,
29
- service : Pipeline < Sr > ,
30
- ctl_service : Pipeline < Ctl > ,
31
+ service : PipelineBinding < Sr , types :: Message > ,
32
+ ctl_service : PipelineBinding < Ctl , ControlFrame > ,
31
33
ctl_fut : cell:: RefCell < Vec < ( ControlFrame , PipelineCall < Ctl , ControlFrame > ) > > ,
32
34
ctl_queue : Rc < ControlQueue > ,
33
- shutdown : cell:: RefCell < Option < BoxFuture < ' static , ( ) > > > ,
34
35
expire : Sleep ,
35
36
idle_timeout : Millis ,
36
37
}
@@ -51,17 +52,16 @@ where
51
52
Dispatcher {
52
53
sink,
53
54
idle_timeout,
54
- service,
55
- ctl_service,
56
55
ctl_queue,
56
+ service : service. bind ( ) ,
57
+ ctl_service : ctl_service. bind ( ) ,
57
58
ctl_fut : cell:: RefCell :: new ( Vec :: new ( ) ) ,
58
- shutdown : cell:: RefCell :: new ( None ) ,
59
59
expire : sleep ( idle_timeout) ,
60
60
}
61
61
}
62
62
63
63
fn call_control_service ( & self , frame : ControlFrame ) {
64
- let fut = self . ctl_service . call_static ( frame. clone ( ) ) ;
64
+ let fut = self . ctl_service . call ( frame. clone ( ) ) ;
65
65
self . ctl_fut . borrow_mut ( ) . push ( ( frame, fut) ) ;
66
66
self . ctl_queue . waker . wake ( ) ;
67
67
}
@@ -152,7 +152,7 @@ where
152
152
let frm = frm. clone ( ) ;
153
153
let fut = self
154
154
. service
155
- . call_static ( types:: Message :: Attached ( frm. clone ( ) , link. clone ( ) ) ) ;
155
+ . call ( types:: Message :: Attached ( frm. clone ( ) , link. clone ( ) ) ) ;
156
156
let _ = ntex:: rt:: spawn ( async move {
157
157
let result = fut. await ;
158
158
if let Err ( err) = result {
@@ -200,80 +200,72 @@ where
200
200
type Response = Option < AmqpFrame > ;
201
201
type Error = AmqpDispatcherError ;
202
202
203
- fn poll_ready ( & self , cx : & mut Context < ' _ > ) -> Poll < Result < ( ) , Self :: Error > > {
204
- self . ctl_queue . waker . register ( cx. waker ( ) ) ;
203
+ async fn ready ( & self , _: ServiceCtx < ' _ , Self > ) -> Result < ( ) , Self :: Error > {
204
+ poll_fn ( |cx| {
205
+ self . ctl_queue . waker . register ( cx. waker ( ) ) ;
205
206
206
- // idle timeout
207
- self . handle_idle_timeout ( cx) ;
207
+ // idle timeout
208
+ self . handle_idle_timeout ( cx) ;
208
209
209
- // process control frame
210
- let mut control_fut_pending = !self . handle_control_fut ( cx) ?;
210
+ // process control frame
211
+ let mut control_fut_pending = !self . handle_control_fut ( cx) ?;
211
212
212
- // check readiness
213
- let service_poll = self . service . poll_ready ( cx) . map_err ( |err| {
214
- let err = Error :: from ( err) ;
215
- log:: error!(
216
- "{}: Publish service readiness check failed: {:?}" ,
217
- self . sink. tag( ) ,
218
- err
219
- ) ;
220
- let _ = self . sink . close_with_error ( err) ;
221
- AmqpDispatcherError :: Service
222
- } ) ?;
213
+ // check readiness
214
+ let service_poll = self . service . poll_ready ( cx) . map_err ( |err| {
215
+ let err = Error :: from ( err) ;
216
+ log:: error!(
217
+ "{}: Publish service readiness check failed: {:?}" ,
218
+ self . sink. tag( ) ,
219
+ err
220
+ ) ;
221
+ let _ = self . sink . close_with_error ( err) ;
222
+ AmqpDispatcherError :: Service
223
+ } ) ?;
223
224
224
- let ctl_service_poll = self . ctl_service . poll_ready ( cx) . map_err ( |err| {
225
- let err = Error :: from ( err) ;
226
- log:: error!(
227
- "{}: Control service readiness check failed: {:?}" ,
228
- self . sink. tag( ) ,
229
- err
230
- ) ;
231
- let _ = self . sink . close_with_error ( err) ;
232
- AmqpDispatcherError :: Service
233
- } ) ?;
225
+ let ctl_service_poll = self . ctl_service . poll_ready ( cx) . map_err ( |err| {
226
+ let err = Error :: from ( err) ;
227
+ log:: error!(
228
+ "{}: Control service readiness check failed: {:?}" ,
229
+ self . sink. tag( ) ,
230
+ err
231
+ ) ;
232
+ let _ = self . sink . close_with_error ( err) ;
233
+ AmqpDispatcherError :: Service
234
+ } ) ?;
234
235
235
- // enqueue pending control frames
236
- if ctl_service_poll. is_ready ( ) && !self . ctl_queue . pending . borrow ( ) . is_empty ( ) {
237
- self . ctl_queue
238
- . pending
239
- . borrow_mut ( )
240
- . drain ( ..)
241
- . for_each ( |frame| {
242
- self . call_control_service ( frame) ;
243
- } ) ;
244
- control_fut_pending = true ;
245
- }
236
+ // enqueue pending control frames
237
+ if ctl_service_poll. is_ready ( ) && !self . ctl_queue . pending . borrow ( ) . is_empty ( ) {
238
+ self . ctl_queue
239
+ . pending
240
+ . borrow_mut ( )
241
+ . drain ( ..)
242
+ . for_each ( |frame| {
243
+ self . call_control_service ( frame) ;
244
+ } ) ;
245
+ control_fut_pending = true ;
246
+ }
246
247
247
- if control_fut_pending || service_poll. is_pending ( ) || ctl_service_poll. is_pending ( ) {
248
- Poll :: Pending
249
- } else {
250
- Poll :: Ready ( Ok ( ( ) ) )
251
- }
248
+ if control_fut_pending || service_poll. is_pending ( ) || ctl_service_poll. is_pending ( ) {
249
+ Poll :: Pending
250
+ } else {
251
+ Poll :: Ready ( Ok ( ( ) ) )
252
+ }
253
+ } )
254
+ . await
252
255
}
253
256
254
- fn poll_shutdown ( & self , cx : & mut Context < ' _ > ) -> Poll < ( ) > {
255
- let mut shutdown = self . shutdown . borrow_mut ( ) ;
256
- if !shutdown. is_some ( ) {
257
- self . sink
258
- . 0
259
- . get_mut ( )
260
- . set_error ( AmqpProtocolError :: Disconnected ) ;
261
- let fut = self
262
- . ctl_service
263
- . call_static ( ControlFrame :: new_kind ( ControlFrameKind :: Closed ) ) ;
264
- * shutdown = Some ( Box :: pin ( async move {
265
- let _ = fut. await ;
266
- } ) ) ;
267
- }
257
+ async fn shutdown ( & self ) {
258
+ self . sink
259
+ . 0
260
+ . get_mut ( )
261
+ . set_error ( AmqpProtocolError :: Disconnected ) ;
262
+ let _ = self
263
+ . ctl_service
264
+ . call ( ControlFrame :: new_kind ( ControlFrameKind :: Closed ) )
265
+ . await ;
268
266
269
- let res0 = shutdown. as_mut ( ) . expect ( "guard above" ) . as_mut ( ) . poll ( cx) ;
270
- let res1 = self . service . poll_shutdown ( cx) ;
271
- let res2 = self . ctl_service . poll_shutdown ( cx) ;
272
- if res0. is_pending ( ) || res1. is_pending ( ) || res2. is_pending ( ) {
273
- Poll :: Pending
274
- } else {
275
- Poll :: Ready ( ( ) )
276
- }
267
+ self . service . shutdown ( ) . await ;
268
+ self . ctl_service . shutdown ( ) . await ;
277
269
}
278
270
279
271
async fn call (
@@ -334,7 +326,7 @@ where
334
326
}
335
327
types:: Action :: DetachReceiver ( link, frm) => {
336
328
let lnk = link. clone ( ) ;
337
- let fut = self . service . call_static ( types:: Message :: Detached ( lnk) ) ;
329
+ let fut = self . service . call ( types:: Message :: Detached ( lnk) ) ;
338
330
let _ = spawn ( async move {
339
331
let _ = fut. await ;
340
332
} ) ;
@@ -352,9 +344,7 @@ where
352
344
} )
353
345
. collect ( ) ;
354
346
355
- let fut = self
356
- . service
357
- . call_static ( types:: Message :: DetachedAll ( receivers) ) ;
347
+ let fut = self . service . call ( types:: Message :: DetachedAll ( receivers) ) ;
358
348
let _ = spawn ( async move {
359
349
let _ = fut. await ;
360
350
} ) ;
0 commit comments