1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//! shutdown.rs: draining on signal.
//!
//! The first SIGINT/SIGTERM asks the relay to stop accepting and drain what is
//! in flight; a second one exits immediately.
//!
//! Draining means the signal is delivered *as end of stream*, not as
//! cancellation: a handle goes down to the reads that touch an endpoint, which
//! stop returning chunks, and the ordinary end-of-stream path takes it from
//! there, so stages still get `on_eof` and still get their last bytes written.
//! Racing a copy against [`Shutdown::recv`] in a `select!` is only correct
//! where nothing is declared and nothing is owed a flush.
//!
//! The blocking copy path can do neither. A `spawn_blocking` task is not
//! cancellable, so it polls [`Shutdown::is_triggered`] between chunks instead.
use watch;
use ;
;
async
async