Anforderungen an die NDKPI-Vervollständigung
NDK-Verbraucher und NDK-Anbieter müssen diese Anforderungen für die Verarbeitung von NDKPI-Vervollständigung befolgen.
Die Regeln für die Funktionen NdkGetCqResults, NdkGetCqResultsEx und NdkArmCq
Der Consumer serialisiert seine Aufrufe an diese Anbieterfunktionen immer im gleichen Vervollständigungswarteschlangenobjekt (NDK_CQ):
- NdkGetCqResults (NDK_FN_GET_CQ_RESULTS)
- NdkGetCqResultsEx (NDK_FN_GET_CQ_RESULTS_EX)
- NdkArmCq (NDK_FN_ARM_CQ)
Dies bedeutet nicht nur, dass der Consumer nie dieselbe Anbieterfunktion mehrmals gleichzeitig aufruft, sondern auch, dass er niemals eine Kombination dieser Funktionen gleichzeitig für denselben CQ aus mehreren Threads aufruft.
Eine NdkOperationTypeReceiveAndInvalidate-Vervollständigung , die als Ergebnis eines NdkSendAndInvalidate-Remoteaufrufs (NDK_FN_SEND_AND_INVALIDATE) auftritt, muss weiterhin mithilfe von NdkGetCqResults (nicht NdkGetCqResultsExn) abgerufen werden können. Dadurch muss das angegebene Token auf dem Empfänger weiterhin ungültig gemacht werden, aber der empfangende Consumer wird nicht über diese Ungültigkeit benachrichtigt (der Consumer muss NdkGetCqResultsEx verwenden, um diese Informationen abzurufen). Ein späterer NdkInvalidate (NDK_FN_INVALIDATE) für dasselbe Token schlägt wie gewohnt fehl.
Regeln für Benachrichtigungsrückrufe
Der Anbieter darf den Rückruf von NdkCqNotificationCallback (NDK_FN_CQ_NOTIFICATION_CALLBACK) nur einmal aufrufen, und erst, nachdem der Consumer den NdkCqNotificationCallback-Rückruf durch Aufrufen von NdkArmCq bewaffnet hat. Das heißt, der Anbieter muss den Arm löschen und den NdkCqNotificationCallback-Rückruf aufrufen, wenn die Bedingungen für den Aufruf des NdkCqNotificationCallback-Rückrufs auftreten (mit anderen Worten, wenn Anforderungsvervollständigungen in der CQ in die Warteschlange gestellt werden).
Wenn im CQ bereits Vervollständigungen vorhanden sind, wenn der Consumer NdkArmCq aufruft, verhält sich der Anbieter wie folgt:
- Wenn mindestens eine der Vervollständigungen seit dem Aufruf des letzten NdkCqNotificationCallback-Rückrufs neu in den CQ platziert wurde, muss der Anbieter die Armanforderung sofort erfüllen (Serialisierungsanforderungen finden Sie unten).
- Wenn jedoch alle Vervollständigungen im CQ auch vorhanden waren, als der letzte NdkCqNotificationCallback-Rückruf aufgerufen wurde (mit anderen Worten, der Consumer hat NdkArmCq aufgerufen, ohne alle Vervollständigungen zu entfernen und keine neuen Vervollständigungen in den CQ platziert), kann der Anbieter die Armanforderung sofort erfüllen.
Wenn der Anbieter den NdkCqNotificationCallback-Rückruf aufrufen muss und bereits ein NdkCqNotificationCallback-Rückruf ausgeführt wird, muss der Anbieter den Aufruf des NdkCqNotificationCallback-Rückrufs zurückstellen, bis nach dem vorhandenen Aufruf des NdkCqNotificationCallback-Rückrufs die Steuerung an den Anbieter zurückgegeben wird. Anders ausgedrückt: Der Anbieter ist für die Serialisierung der NdkCqNotificationCallback-Rückrufe verantwortlich.
Die folgende Tabelle zeigt den resultierenden Armtyp, wenn NdkArmCq ein zweites Mal aufgerufen wird, bevor eine vorherige NdkArmCq-Anforderung erfüllt wird:
2. Arm ANY | Fehler im 2. Arm | 2. Arm SOLICITED | |
---|---|---|---|
1. Arm ANY |
ANY |
ANY |
ANY |
Fehler am 1. Arm |
ANY |
FEHLER |
ANGEFORDERTE |
1. Arm SOLICITED |
ANY |
ANGEFORDERTE |
ANGEFORDERTE |