1

USB デバイスを処理する Driverkit ドライバーがあります。ドライバーは、USB パケット内のデータをアンパックし、アプリとドライバーの間で共有されるバッファーにデータを書き込みます。共有バッファーは、アプリによってIOConnectCallAsyncMethod. アプリがバッファーを使用する準備ができると、ドライバーはオブジェクトIOUserClient::AsyncCompletionを使用して呼び出しOSActionます。オブジェクトは、アプリによるOSAction呼び出しの結果としても作成されますIOConnectCallAsyncMethodOSAction共有バッファーごとに 1 つのオブジェクトがあります。

アプリ内のイベントを処理するメカニズムでエラーが発生した場合、ドライバーにOSActionオブジェクトの呼び出しを停止するように指示すると、アプリ内のイベントを処理するスレッドが停止します。この時点で、アプリ内のすべてのイベントを処理したかどうか確信が持てません。また、ドライバーにメッセージを送信して再起動するときは、停止前のイベントが処理されるキューにないことを確認したいと考えています。アプリ。

これにより、コールバックがキャンセルされたときに呼び出されるハンドラーOSAction::Cancelを渡すことができます。このメソッドのドキュメントには、実行中のコールバックの実行が終了した後にシステムが呼び出すハンドラー ブロックが記載されています。

インフライト」コールバックとはどういう意味ですか?

Cancelすべてのオブジェクトを呼び出しOSAction、各オブジェクトのカウンターをデクリメントしてOSAction、キャンセルの完了を追跡します ( Appleのこのサンプル プロジェクトと同様)。問題は、ブロックが呼び出されたことがわからないことです。

ブロックが呼び出されるのはいつですか? 私が考えることができるいくつかの異なる状況は次のとおりです。

  • OSActionに渡されなかったですAsyncCompletion
  • OSActionに渡されましたAsyncCompletionが、アプリはイベントを処理しませんでした。
  • OSActionに渡されたAsyncCompletion。アプリはイベントの処理を開始しましたが、アプリはまだイベントの処理を完了していません。

また、ブロックの呼び出しに使用されるドライバーのディスパッチ キューについても考えています。

4

0 に答える 0