Module op

Source
Expand description

此模块定义了用于异步环境下的操作.

Op 表示一个提交到 Driver 的操作,它实现了 Future,因此可以在异步上下文中使用 .await 来等待该操作的返回值.所有的操作都需要实现 Completable,它描述了如何将接收的响应值转换为对应操作的返回值,以及如何回收该操作已提交的资源

§操作的取消

Opdrop 时,

  1. 如果该操作已完成,那么它对应的 OpId 和资源将被回收.
  2. 否则,Completable::cancel 被调用,直到其生命周期结束时,它占用的资源才会被回收.

每个 Completable 必须在被取消时回收全部已提交的资源,否则将会导致 UB.如果某个操作被取消,但它的生命周期一直没有结束,这是安全的,但会导致资源泄露,如下所示,

let id = drv.submit();
let op = Op::new(handle, id, Noop);
drop(op); // <- 被 drop 时,Op 自动被取消
assert!(drv.contains(id));
//          ^ Op 占用的资源将一直存在
assert!(drv.complete(id, ()).is_err());
//                           ^ 完成被取消的 Op 会返回错误
assert!(!drv.contains(id));
//      ^ 直到生命周期结束它占用的资源才被回收

调用 Driver::complete 时,它会返回指定的操作是否已被取消,因此实现者也可以利用这一点来回收资源.

Structs§

Cancellation
Op

Traits§

Completable
Safety