1
+ #![ feature( async_await) ]
1
2
#![ feature( test) ]
2
3
#![ deny( warnings) ]
3
4
4
- extern crate futures;
5
- extern crate hyper;
6
- extern crate pretty_env_logger;
7
5
extern crate test;
8
- extern crate tokio;
9
6
10
7
use std:: io:: { Read , Write } ;
11
8
use std:: net:: { TcpStream } ;
12
9
use std:: sync:: mpsc;
10
+ use std:: time:: Duration ;
13
11
14
- use futures :: Future ;
15
- use futures :: sync:: oneshot;
12
+ use tokio :: runtime :: current_thread ;
13
+ use tokio :: sync:: oneshot;
16
14
17
15
use hyper:: { Body , Response , Server } ;
18
- use hyper:: service:: service_fn_ok ;
16
+ use hyper:: service:: { make_service_fn , service_fn } ;
19
17
20
18
const PIPELINED_REQUESTS : usize = 16 ;
21
19
22
20
#[ bench]
23
21
fn hello_world ( b : & mut test:: Bencher ) {
24
22
let _ = pretty_env_logger:: try_init ( ) ;
25
23
let ( _until_tx, until_rx) = oneshot:: channel :: < ( ) > ( ) ;
24
+
26
25
let addr = {
27
26
let ( addr_tx, addr_rx) = mpsc:: channel ( ) ;
28
- :: std:: thread:: spawn ( move || {
27
+ std:: thread:: spawn ( move || {
29
28
let addr = "127.0.0.1:0" . parse ( ) . unwrap ( ) ;
29
+
30
+ let make_svc = make_service_fn ( |_| async {
31
+ Ok :: < _ , hyper:: Error > ( service_fn ( |_| async {
32
+ Ok :: < _ , hyper:: Error > ( Response :: new ( Body :: from ( "Hello, World!" ) ) )
33
+ } ) )
34
+ } ) ;
30
35
let srv = Server :: bind ( & addr)
31
36
. http1_pipeline_flush ( true )
32
- . serve ( || {
33
- service_fn_ok ( move |_| {
34
- Response :: new ( Body :: from ( "Hello, World!" ) )
35
- } )
36
- } ) ;
37
+ . serve ( make_svc) ;
38
+
37
39
addr_tx. send ( srv. local_addr ( ) ) . unwrap ( ) ;
38
- let fut = srv
39
- . map_err ( |e| panic ! ( "server error: {}" , e) )
40
- . select ( until_rx. then ( |_| Ok ( ( ) ) ) )
41
- . then ( |_| Ok ( ( ) ) ) ;
42
- let mut rt = tokio:: runtime:: current_thread:: Runtime :: new ( ) . unwrap ( ) ;
43
- rt. spawn ( fut) ;
40
+
41
+ let graceful = srv
42
+ . with_graceful_shutdown ( async {
43
+ until_rx. await . ok ( ) ;
44
+ } ) ;
45
+
46
+ let mut rt = current_thread:: Runtime :: new ( ) . unwrap ( ) ;
47
+ rt. spawn ( async {
48
+ if let Err ( e) = graceful. await {
49
+ panic ! ( "server error: {}" , e) ;
50
+ }
51
+ } ) ;
44
52
rt. run ( ) . unwrap ( ) ;
45
53
} ) ;
46
54
@@ -60,7 +68,7 @@ fn hello_world(b: &mut test::Bencher) {
60
68
} * PIPELINED_REQUESTS ;
61
69
62
70
let mut tcp = TcpStream :: connect ( addr) . unwrap ( ) ;
63
- tcp. set_read_timeout ( Some ( :: std :: time :: Duration :: from_secs ( 3 ) ) ) . unwrap ( ) ;
71
+ tcp. set_read_timeout ( Some ( Duration :: from_secs ( 3 ) ) ) . unwrap ( ) ;
64
72
let mut buf = [ 0u8 ; 8192 ] ;
65
73
66
74
b. bytes = ( pipelined_reqs. len ( ) + total_bytes) as u64 ;
0 commit comments