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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//! # aetherflow-runtime — マルチコア thread-per-core actor ランタイム
//!
//! design.md の 4 本柱を実装:
//! - ①型による隔離 / ②zero-copy move → [`ActorRef::try_send`] が `A::Message` を **move** で取る。
//! use-after-send はコンパイルエラー(E0382)。
//! - ③物理配置 → [`System`] が **コアごとに 1 スレッド**を立ててピン留めし、各スレッドが
//! そのコアに割り当てられた多数の actor を run-to-completion で回す。mailbox はコアを跨がない
//! lock-free キュー(`mpsc`)。
//! - ④work-stealing 排除 → Tokio 不使用。actor はコア間を移動しない(静的配置)。
//!
//! ## thread-per-core であって thread-per-actor ではない
//! 1 コア = 1 OS スレッドが**多数の actor** を回す。actor ごとにスレッドを立てない(それは
//! thread-per-actor でスケールしない)。同一コアの異種 actor は型消去して 1 スレッドで回し、
//! 送信は typed な [`ActorRef`] のまま — capability-mapping §7 の「制御面=erased / データ面=typed」。
//!
//! ## 使い方
//! ```
//! use aetherflow::{System, Actor};
//! use std::sync::mpsc;
//!
//! struct Adder { sum: u64, out: mpsc::Sender<u64> }
//! impl Actor for Adder {
//! type Message = u64;
//! fn handle(&mut self, msg: u64) { self.sum += msg; self.out.send(self.sum).unwrap(); }
//! }
//!
//! let sys = System::with_cores(2);
//! let (out, results) = mpsc::channel();
//! let addr = sys.spawn_on(0, Adder { sum: 0, out }); // コア 0 に配置
//! addr.send_blocking(10);
//! addr.send_blocking(5);
//! drop(addr); // 送信端が全て落ちると、その actor はコアから外れる
//! sys.shutdown(); // 全コアを停止して join
//! assert_eq!(results.recv().unwrap(), 10);
//! assert_eq!(results.recv().unwrap(), 15);
//! ```
//!
//! ## 隔離はコンパイル時に強制される
//! ```compile_fail
//! use aetherflow::{System, Actor};
//! struct Order { qty: u32 }
//! struct E;
//! impl Actor for E { type Message = Order; fn handle(&mut self, m: Order) { let _ = m.qty; } }
//! let sys = System::with_cores(1);
//! let addr = sys.spawn_on(0, E);
//! let order = Order { qty: 100 };
//! addr.try_send(order).ok(); // move で移譲
//! println!("{}", order.qty); // use of moved value `order` (E0382):コンパイル不能
//! ```
// SPSC は単一生産者の高速パス / 将来のコア間ペアキュー(Seastar 流)用に温存。
// 現在の公開 API(System)は MPSC mailbox を使うため、これは予約の tested primitive。
pub use ;
pub use LatencySnapshot;
pub use ;
/// 非ブロッキング送信 `try_send` の失敗理由。いずれも**元のメッセージを返す**ので、
/// 呼び出し側は再ルーティング・永続化・ログ記録ができる。
/// ブロッキング送信 `send_blocking` の失敗理由。満杯は待つので、残るのは Closed のみ。
/// 型付き actor。メッセージ型は固定で `Send`(= sendable な `iso`/`val` を型で要求)。