Exigences de gestion de la saisie semi-automatique NDKPI
Les consommateurs NDK et les fournisseurs NDK doivent respecter ces exigences pour la gestion de l’achèvement NDKPI.
Règles pour les fonctions NdkGetCqResults, NdkGetCqResultsEx et NdkArmCq
Le consommateur sérialise toujours ses appels à ces fonctions de fournisseur sur le même objet de file d’attente d’achèvement (NDK_CQ) :
- NdkGetCqResults (NDK_FN_GET_CQ_RESULTS)
- NdkGetCqResultsEx (NDK_FN_GET_CQ_RESULTS_EX)
- NdkArmCq (NDK_FN_ARM_CQ)
Cela signifie non seulement que le consommateur n’appellera jamais la même fonction de fournisseur plusieurs fois simultanément, mais qu’il n’appellera jamais une combinaison de ces fonctions simultanément sur le même CQ à partir de plusieurs threads.
Une complétion NdkOperationTypeReceiveAndInvalidate qui se produit à la suite d’un appel NdkSendAndInvalidate (NDK_FN_SEND_AND_INVALIDATE) distant doit toujours être récupérable à l’aide de NdkGetCqResults (et non de NdkGetCqResultsExn). Cela doit toujours invalider le jeton spécifié sur le récepteur, mais n’informera pas le consommateur récepteur de cette invalidation (le consommateur doit utiliser NdkGetCqResultsEx pour obtenir ces informations). Un NdkInvalidate ultérieur (NDK_FN_INVALIDATE) pour le même jeton échouera, comme d’habitude.
Règles pour les rappels de notification
Le fournisseur doit appeler le rappel NdkCqNotificationCallback (NDK_FN_CQ_NOTIFICATION_CALLBACK) une seule fois, et seulement après que le consommateur a armé le rappel NdkCqNotificationCallback en appelant NdkArmCq. Autrement dit, le fournisseur doit effacer le bras et appeler le rappel NdkCqNotificationCallback lorsque les conditions d’appel du rappel NdkCqNotificationCallback se produisent (en d’autres termes, lorsque les achèvements de requête sont mis en file d’attente dans le CQ).
Si des complétions sont déjà présentes dans le CQ lorsque le consommateur appelle NdkArmCq, le fournisseur se comporte comme suit :
- Si au moins une des complétions a été récemment placée dans le CQ depuis l’appel du dernier rappel NdkCqNotificationCallback , le fournisseur doit satisfaire immédiatement la demande d’arm (voir ci-dessous pour connaître les exigences de sérialisation).
- Toutefois, si toutes les complétions dans le CQ étaient présentes également lorsque le dernier rappel NdkCqNotificationCallback a été appelé (en d’autres termes, le consommateur a appelé NdkArmCq sans supprimer toutes les complétions et aucune nouvelle complétion n’a été placée dans le CQ), le fournisseur peut satisfaire la demande arm immédiatement.
Lorsque le fournisseur doit appeler le rappel NdkCqNotificationCallback , s’il existe déjà un rappel NdkCqNotificationCallback en cours, le fournisseur doit différer l’appel du rappel NdkCqNotificationCallback jusqu’à ce que l’appel existant au rappel NdkCqNotificationCallback retourne le contrôle au fournisseur. En d’autres termes, le fournisseur est responsable de la sérialisation des rappels NdkCqNotificationCallback .
Le tableau suivant montre le type de bras résultant si NdkArmCq est appelé une deuxième fois avant qu’une requête NdkArmCq précédente soit satisfaite :
2e bras ANY | ERREURS du 2e bras | 2e bras SOLLICITÉ | |
---|---|---|---|
1er bras ANY |
ANY |
ANY |
ANY |
1er bras ERREURS |
ANY |
ERREURS |
SOLLICITÉ |
1er bras SOLLICITÉ |
ANY |
SOLLICITÉ |
SOLLICITÉ |