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 上同時呼叫這些函式的任何組合。
NdkOperationTypeReceiveAndInvalidate完成,因為遠端NdkSendAndInvalidate (NDK_FN_SEND_AND_INVALIDATE) 呼叫,仍必須使用NdkGetCqResults (不是NdkGetCqResultsExn) 來擷取。 這麼做仍然必須在接收者上使指定的權杖失效,但不會通知接收者此失效 (取用者必須使用 NdkGetCqResultsEx 來取得此資訊) 。 較新的 NdkInvalidate (NDK_FN_INVALIDATE 相同權杖的) 將會如往常一樣失敗。
通知回呼的規則
提供者必須呼叫NdkCqNotificationCallback (NDK_FN_CQ_NOTIFICATION_CALLBACK) 回呼一次,而且只有在取用者呼叫NdkCqNotificationCallback 回呼之後,才呼叫 NdkCqNotificationCallback回呼。 也就是說,當呼叫 NdkCqNotificationCallback 回呼的條件 (發生時,提供者必須清除 arm 並呼叫 NdkCqNotificationCallback 回 呼的條件,換句話說,當要求完成排入 CQ) 時。
如果取用者呼叫 NdkArmCq時 CQ 中已經有完成,提供者的行為會如下所示:
- 如果在呼叫最後一個 NdkCqNotificationCallback 回 呼之後,至少已將其中一個完成放入 CQ 中,提供者必須立即滿足 arm 要求, (請參閱下方的序列化需求) 。
- 不過,如果 CQ 中的所有完成也會出現在最後一個 NdkCqNotificationCallback 回 呼 (,則取用者會呼叫 NdkArmCq 而不移除所有完成,而且沒有新的完成放入 CQ) ,則提供者可能會立即滿足 arm 要求。
當提供者需要呼叫 NdkCqNotificationCallback 回呼時,如果已經有 NdkCqNotificationCallback 回呼進行中,提供者必須延遲 NdkCqNotificationCallback 回呼的調用,直到對 NdkCqNotificationCallback 回呼的現有呼叫傳回給提供者為止。 換句話說,提供者負責序列化 NdkCqNotificationCallback 回 呼。
下表顯示如果 NdkArmCq 在滿足先前 的 NdkArmCq 要求之前第二次呼叫,則會產生 arm 類型:
第 2 個 arm ANY | 第 2 部 ARM 錯誤 | 第 2 部 ARM SOLICITED | |
---|---|---|---|
第 1 個 arm ANY |
ANY |
ANY |
ANY |
第 1 部錯誤 |
ANY |
錯誤 |
徵求 |
第 1 個 arm SOLICITED |
ANY |
徵求 |
徵求 |