USB デバイスを処理する Driverkit ドライバーがあります。ドライバーは、USB パケット内のデータをアンパックし、アプリとドライバーの間で共有されるバッファーにデータを書き込みます。共有バッファーは、アプリによってIOConnectCallAsyncMethod
. アプリがバッファーを使用する準備ができると、ドライバーはオブジェクトIOUserClient::AsyncCompletion
を使用して呼び出しOSAction
ます。オブジェクトは、アプリによるOSAction
呼び出しの結果としても作成されますIOConnectCallAsyncMethod
。OSAction
共有バッファーごとに 1 つのオブジェクトがあります。
アプリ内のイベントを処理するメカニズムでエラーが発生した場合、ドライバーにOSAction
オブジェクトの呼び出しを停止するように指示すると、アプリ内のイベントを処理するスレッドが停止します。この時点で、アプリ内のすべてのイベントを処理したかどうか確信が持てません。また、ドライバーにメッセージを送信して再起動するときは、停止前のイベントが処理されるキューにないことを確認したいと考えています。アプリ。
これにより、コールバックがキャンセルされたときに呼び出されるハンドラーOSAction::Cancel
を渡すことができます。このメソッドのドキュメントには、実行中のコールバックの実行が終了した後にシステムが呼び出すハンドラー ブロックが記載されています。
「インフライト」コールバックとはどういう意味ですか?
Cancel
すべてのオブジェクトを呼び出しOSAction
、各オブジェクトのカウンターをデクリメントしてOSAction
、キャンセルの完了を追跡します ( Appleのこのサンプル プロジェクトと同様)。問題は、ブロックが呼び出されたことがわからないことです。
ブロックが呼び出されるのはいつですか? 私が考えることができるいくつかの異なる状況は次のとおりです。
OSAction
に渡されなかったですAsyncCompletion
。OSAction
に渡されましたAsyncCompletion
が、アプリはイベントを処理しませんでした。OSAction
に渡されたAsyncCompletion
。アプリはイベントの処理を開始しましたが、アプリはまだイベントの処理を完了していません。
また、ブロックの呼び出しに使用されるドライバーのディスパッチ キューについても考えています。