OSAction::Cancel回调handler触发时机及相关开发疑问
问题1:“in-flight”回调的具体含义是什么?
这里的in-flight回调指已经通过IOUserClient::AsyncCompletion提交给系统、尚未完成全链路执行的回调。只要系统已经开始处理该OSAction对应的通知递送,无论处于「已递送到应用侧事件队列但应用尚未触发回调」「应用侧回调已经启动但尚未返回」哪个阶段,都属于in-flight状态。
问题2:不同场景下OSAction::Cancel的handler触发时机
Cancel方法传入的handler只会在对应OSAction的所有未完成操作全部收尾后触发,三个场景的触发时机分别如下:
- 从未被传入
AsyncCompletion的OSAction:调用Cancel后handler会立刻触发。这类OSAction没有正在处理的递送任务,系统不需要等待任何异步操作完成。 - 已传入
AsyncCompletion但应用尚未处理对应事件的OSAction:系统会先标记该OSAction已取消,将还没递送的事件从队列中清理完成后,就会触发handler,不需要等待应用侧处理已取消的事件。 - 已传入
AsyncCompletion且应用已开始处理事件但尚未处理完成的OSAction:系统会等待应用侧的回调函数执行返回后,才会触发handler,确保没有正在执行的回调逻辑残留。
如果观测不到handler被触发,通常有两个常见原因:一是驱动没有正确持有OSAction对象的引用,调用Cancel前OSAction已经被释放;二是驱动侧的dispatch队列被阻塞,导致handler的执行被延后。
问题3:驱动侧调用该handler时会使用哪个dispatch queue?
handler会在你调用OSAction::Cancel方法时所在的dispatch queue上执行。如果调用Cancel时是在驱动的默认工作队列,handler就会投递到该默认队列执行;如果是在自定义的dispatch队列调用Cancel,handler就会在对应自定义队列执行。
内容的提问来源于stack exchange,提问作者tuple_cat
相关产品推荐
相关产品推荐

