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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
//! 定义 `ManagerActor` 及其核心逻辑。
//!
//! 这个模块是整个零拷贝缓冲库的核心,负责管理缓冲区的状态、处理来自
//! `ZeroCopyHandle` 的请求(如预留空间、提交数据、最终化),以及与配置的
//! 组件(分配器、生命周期管理器、数据处理器、最终化处理器)进行交互。
//!
//! 主要包含:
//! - `ManagerActor` 结构体定义。
//! - 启动 `ManagerActor` 的 `spawn` 函数。
//! - 核心的异步事件循环 `run` 方法。
//! - 请求分发逻辑 `handle_request`。
//! - 用于简化启动的 `spawn_manager!` 宏。
//!
//! 具体的实现细节分布在子模块中:
//! - `actor`: 包含 `ManagerActor` 结构体和其 `impl` 块。
//! - `components`: 定义了 `ManagerActor` 依赖的各种组件 trait 及其默认实现。
//! - `operations`: 包含处理具体请求(如 reserve, submit, finalize)的函数。
//! - `state`: 定义了 `ManagerActor` 内部使用的状态结构体。
// 声明子模块
// `ManagerActor` 结构体和 `impl` 块
// 定义组件 trait 和默认实现
// 处理具体操作的函数
// 定义 Manager 内部状态结构
// 公开导出 ManagerActor 结构体,以便用户可以指定泛型参数
pub use ManagerActor;
// 公开导出默认组件和 ManagerComponents trait
pub use ;
// 公开导出内部使用的参数类型(重命名以提示其内部性)
pub use MinGroupCommitSizeParam as _MinGroupCommitSizeParam;
/// 一个宏,用于简化 `ManagerActor` 的启动过程。
///
/// 这个宏提供了两种方式来启动 `ManagerActor`:
/// 1. 使用库提供的默认组件 (`DefaultManagerComponents`)。
/// 2. 使用用户自定义的组件集合(通过一个实现了 `ManagerComponents` 的 ZST 标记类型指定)。
///
/// # 使用默认组件
///
/// ```rust
/// # use zc_buffer::{spawn_manager, defaults::DefaultManagerComponents, manager::components::ComponentsBuilder};
/// # use std::num::NonZeroUsize;
/// # use tokio::runtime::Runtime;
/// #
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
/// # let rt = Runtime::new()?;
/// # rt.block_on(async {
/// // 使用 `default` 关键字指定使用默认组件。
/// // `config` 参数需要是 `DefaultManagerComponents` 的 `ComponentsBuilder` 配置类型。
/// // 对于默认实现,配置是 `MinGroupCommitSizeParam` (通常是一个 `usize`)。
/// let min_group_commit_size = 100usize;
/// let buffer_size = NonZeroUsize::new(128).unwrap();
///
/// // 调用宏启动 ManagerActor
/// let (handle, completed_rx, failed_rx) =
/// spawn_manager!(default, buffer_size, &min_group_commit_size);
/// # });
/// # Ok(())
/// # }
/// ```
///
/// # 使用自定义组件
///
/// ```rust,ignore
/// use zc_buffer::{spawn_manager, ManagerComponents, build_manager_components, components::*};
/// use std::num::NonZeroUsize;
/// use tokio::runtime::Runtime;
///
/// // 假设你定义了自己的组件实现
/// struct MyAllocator;
/// impl ReservationAllocator for MyAllocator { /* ... */ }
/// // ... 其他自定义组件 ...
///
/// // 使用 build_manager_components! (或手动实现) 创建一个 ZST 标记类型
/// build_manager_components! {
/// struct MyComponents;
/// // 指定自定义组件,未指定的将使用默认实现
/// reservation_allocator: MyAllocator,
/// // 如果自定义组件有不同的配置类型,也需要在此指定或实现 ComponentsBuilder
/// }
///
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
/// # let rt = Runtime::new()?;
/// # rt.block_on(async {
/// // `config` 需要是 `MyComponents` 的 `ComponentsBuilder` 配置类型。
/// // 假设自定义组件也使用 usize 作为配置。
/// let custom_config = 100usize;
/// let buffer_size = NonZeroUsize::new(128).unwrap();
///
/// // 传入 ZST 实例 (MyComponents) 来指定组件集
/// let (handle, completed_rx, failed_rx) =
/// spawn_manager!(MyComponents, buffer_size, &custom_config);
/// # });
/// # Ok(())
/// # }
/// ```
///
/// # 参数
///
/// - **第一个参数**: `default` 关键字或一个实现了 `ManagerComponents` 的 ZST 实例表达式。
/// - **第二个参数**: `channel_buffer_size` (`NonZeroUsize`),用于 Manager 内部 MPSC 通道的缓冲区大小。
/// - **第三个参数**: `config` (引用),对应于所选 `ManagerComponents` 的 `ComponentsBuilder` 配置类型。
///
/// # 返回值
///
/// 与 `ManagerActor::spawn` 或 `_spawn_manager_with_components_token` 相同:
/// `(ZeroCopyHandle, mpsc::Receiver<SuccessfulGroupData>, mpsc::Receiver<FailedGroupDataTransmission>)`