c++ - 我什么时候可以调用 OSAction::Cancel 处理程序?
问题描述
我有一个负责 USB 设备的 Driverkit 驱动程序。驱动程序解压缩 USB 数据包中的数据,并将数据写入应用程序和驱动程序之间共享的缓冲区。共享缓冲区由应用程序使用IOConnectCallAsyncMethod
. 当应用程序准备好使用缓冲区时,驱动程序会IOUserClient::AsyncCompletion
使用一个OSAction
对象进行调用。该OSAction
对象也是作为IOConnectCallAsyncMethod
应用程序调用的结果而创建的。OSAction
每个共享缓冲区有一个对象。
如果处理应用程序中事件的机制出现错误,我会告诉驱动程序停止调用OSAction
对象,并且处理应用程序中事件的线程将停止。在这一点上,我不能确定我已经处理了应用程序中的所有事件,并且当我向驱动程序发送消息以重新启动时,我想确保在停止之前没有事件在等待处理的队列中应用程序。
我看过OSAction::Cancel
,它允许您传递一个应在取消回调时调用的处理程序。此方法的文档说在任何正在进行的回调完成执行后系统调用的处理程序块。
“飞行中”回调是什么意思?
我调用Cancel
所有OSAction
对象,并为每个对象递减一个计数器OSAction
以跟踪取消完成(类似于 Apple 的这个示例项目)。问题是我看不到该块被调用。
我什么时候可以调用块?我能想到的一些不同的情况是:
- 一个
OSAction
从未传递给AsyncCompletion
. OSAction
传递给但应用AsyncCompletion
程序未处理事件的 。OSAction
传递给的AsyncCompletion
,应用程序开始处理事件,但应用程序尚未完成事件。
我还想知道驱动程序中的哪个调度队列将用于调用块。
解决方案
推荐阅读
- javascript - 猫鼬不验证更新的部分
- swift - 无法将“MobileNetV2”类型的值转换为预期的参数类型“VNCoreMLModel”
- json - 从 Pyomo 输出解析 JSON 变量数据
- node.js - 更改与其他文档相关的文档中的字段的方法
- c# - 无法统一引用游戏对象的 2D 数组
- html - 我是 html 的初学者,我的代码不起作用
- javascript - 兄弟组件不会在状态更改时重新渲染(使用 useEffect、useState 和 Context)
- swift - 当输入的值大于某个值时如何限制用户输入 Swift 5.1
- php - 在 MYSQL 中搜索拼写错误的单词的最佳方法
- scala - 在 scala 中使用 Spark Structured Streaming 从 kafka 流式传输到 kafka