1个不稳定版本
0.1.0 | 2021年2月28日 |
---|
#49 in #dynamically
115KB
1K SLoC
exit-stack
动态将值固定到栈上。
lib.rs
:
动态将值固定到栈上。
这源于在全局分配器不可用(或不想使用)的情况下,固定值的问题。通常将值固定到栈上的方法是使用pin_utils
宏,它通过覆盖值来实现,因此无法避免运行其Drop实现。然而,由于设计限制,这只能在值数量静态已知的情况下工作。
这个crate补充了这个机制。它通过在内存区域周围使用固定包装来构造一个与该区域一起丢弃的值的链表,因此也可以将其视为已固定。缺点是更不精确的跟踪,默认情况下需要值本身具有'static
生命周期。
用法
使用此功能以启动子例程,该子例程在运行期间必须固定某个任务。一个例子是DMA传输,绝对需要在它被丢弃时通知或等待远程端(否则可能会在以后某个时刻损坏一些内存)。通常,这不太容易实现,因为子例程中的任务栈固定将在退出时立即丢弃它们。
use core::pin::Pin;
use exit_stack::ExitStack;
#[derive(Default)]
struct DmaTask {
// ..
}
impl DmaTask {
// Start a DMA transfer, return an identifier for it.
pub fn start(self: Pin<&mut Self>) -> usize {
// ..
}
}
fn start_pinned(mut stack: Pin<&ExitStack<DmaTask>>) -> Option<usize> {
let task = stack
.slot()?
.pin(DmaTask::default());
Some(task.start())
}