1

我有一个负责 USB 设备的 Driverkit 驱动程序。驱动程序解压缩 USB 数据包中的数据,并将数据写入应用程序和驱动程序之间共享的缓冲区。共享缓冲区由应用程序使用IOConnectCallAsyncMethod. 当应用程序准备好使用缓冲区时,驱动程序会IOUserClient::AsyncCompletion使用一个OSAction对象进行调用。该OSAction对象也是作为IOConnectCallAsyncMethod应用程序调用的结果而创建的。OSAction每个共享缓冲区有一个对象。

如果处理应用程序中事件的机制出现错误,我会告诉驱动程序停止调用OSAction对象,并且处理应用程序中事件的线程将停止。在这一点上,我不能确定我已经处理了应用程序中的所有事件,并且当我向驱动程序发送消息以重新启动时,我想确保在停止之前没有事件在等待处理的队列中应用程序。

我看过OSAction::Cancel,它允许您传递一个应在取消回调时调用的处理程序。此方法的文档说在任何正在进行的回调完成执行后系统调用的处理程序块。

飞行中”回调是什么意思?

我调用Cancel所有OSAction对象,并为每个对象递减一个计数器OSAction以跟踪取消完成(类似于 Apple 的这个示例项目)。问题是我看不到该块被调用。

我什么时候可以调用块?我能想到的一些不同的情况是:

  • 一个OSAction从未传递给AsyncCompletion.
  • OSAction传递给但应用AsyncCompletion程序未处理事件的 。
  • OSAction传递给的AsyncCompletion,应用程序开始处理事件,但应用程序尚未完成事件。

我还想知道驱动程序中的哪个调度队列将用于调用块。

4

0 回答 0