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
71
72
//! **The window's off-frame poster** (REMOTE §1.2, §9.8; bl-4841): the thread
//! that sends the window's acts over the wire and lands their receipts where
//! the frame can read them.
//!
//! It is the [`asker`](super::asker)'s twin on the write side, and it differs in
//! exactly two ways, both of which follow from what an act *is*.
//!
//! **It is pushed, never polled.** A read is standing — the asker re-asks the
//! set on a period because the world moves under it. An act happens once, when
//! an operator clicks, so this thread parks on its channel and dials the moment
//! something is posted. That is also its whole lifetime: the recv ends when the
//! frame's [`Post`](super::post::Post) drops, so there is no stop flag, no
//! unpark and no join — the channel is the thread.
//!
//! **It is a thread of its own, and that is the point.** An act can take as long
//! as the verb behind it: a `bl close` runs a gate, and a piped `lernie` verb
//! runs until it is done. On the asker's thread that would stall every standing
//! read for the duration, which is the frame going blind because the operator
//! clicked something. Acts are serialized among themselves — one connection at a
//! time, in the order they were clicked — which is strictly less blocking than
//! the in-process dispatch this replaces, where the *frame itself* waited.
use Seat;
use Outbox;
use crateRepaint;
use Arc;
use JoinHandle;
/// One window's poster: its seat on the wire, its end of the frame's outbox,
/// and the repaint that wakes the glass when a receipt lands.