NDKPI 完了処理要件
NDK コンシューマーと NDK プロバイダーは、NDKPI 完了処理のためにこれらの要件に従う必要があります。
NdkGetCqResults、NdkGetCqResultsEx、および NdkArmCq Functionsのルール
コンシューマーは常に、同じ完了キュー (CQ) オブジェクト( NDK_CQ) でこれらのプロバイダー関数への呼び出しをシリアル化します。
- NdkGetCqResults (NDK_FN_GET_CQ_RESULTS)
- NdkGetCqResultsEx (NDK_FN_GET_CQ_RESULTS_EX)
- NdkArmCq (NDK_FN_ARM_CQ)
つまり、コンシューマーが同じプロバイダー関数を同時に複数回呼び出すことがないだけでなく、複数のスレッドから同じ CQ 上でこれらの関数の組み合わせを同時に呼び出すこともありません。
リモートの NdkSendAndInvalidate (NDK_FN_SEND_AND_INVALIDATE) 呼び出しの結果として発生した NdkOperationTypeReceiveAndInvalidate 完了は、まだ NdkGetCqResultsを使用して取得可能である必要があります (NdkGetCqResultsExn ではありません)。 これを行う場合でも、受信側で指定されたトークンを無効にする必要がありますが、この無効化を受信側のコンシューマーには通知しません (コンシューマーはこの情報を取得するために NdkGetCqResultsEx を使用する必要があります)。 同じトークンに対して後で NdkInvalidate (NDK_FN_INVALIDATE) を行うと、通常は失敗します。
通知コールバックのルール
プロバイダーは、NdkCqNotificationCallback(NDK_FN_CQ_NOTIFICATION_CALLBACK)コールバックを一度だけ呼び出す必要があり、コンシューマが NdkArmCq を呼び出して NdkCqNotificationCallback コールバックを待機させた後にのみ呼び出す必要があります。 つまり、プロバイダーは、NdkCqNotificationCallback コールバックを呼び出す条件が発生した場合(言い換えれば、要求完了が CQ 内でキューに入っている場合)に、アームをクリアして NdkCqNotificationCallback コールバックを呼び出す必要があります。
コンシューマーが NdkArmCq を呼び出したときに、 CQ 内に完了が既に存在する場合、プロバイダーは以下のように動作します。
- 最後に NdkCqNotificationCallback コールバックが呼び出されてから、少なくとも 1 つの完了が新たに CQ に配置された場合、プロバイダーは直ちにアーム要求を満たす必要があります(シリアル化の要件については以下を参照してください)。
- ただし、最後の NdkCqNotificationCallback コールバックが呼び出されたときにも CQ 内のすべての完了が存在していた場合(言い換えれば、コンシューマがすべての完了を削除せずに NdkArmCq を呼び出し、新しい完了が CQ に配置されなかった場合)、プロバイダーはすぐにアーム要求を満たすことができます。
プロバイダーが NdkCqNotificationCallback コールバックを呼び出す必要がある場合、すでに NdkCqNotificationCallback コールバックが進行中であれば、プロバイダーは、NdkCqNotificationCallback コールバックへの既存の呼び出しがプロバイダーに制御を返した後まで、NdkCqNotificationCallback コールバックの呼び出しを延期する必要があります。 つまり、プロバイダーは NdkCqNotificationCallback コールバックのシリアル化を担当します。
以下の表は、以前の NdkArmCq 要求が満たされる前に NdkArmCq が 2 回目に呼び出された場合の結果のアームの種類を示しています。
2 回目のアーム ANY | 2 回目のアーム ERRORS | 2 回目のアーム SOLICITED | |
---|---|---|---|
1 回目のアーム ANY |
ANY |
ANY |
ANY |
1 回目のアーム ERRORS |
ANY |
エラー |
SOLICITED |
1 回目のアーム SOLICITED |
ANY |
SOLICITED |
SOLICITED |