共用方式為


NDKPI 完成處理需求

NDK 取用者和 NDK 提供者必須遵循這些 NDKPI 完成處理的需求。

NdkGetCqResults、NdkGetCqResultsEx 和 NdkArmCq Functions 的規則

取用者一律會將對這些提供者函式的呼叫序列化為相同的完成佇列, (CQ) 物件 (NDK_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

徵求

徵求

網路直接核心提供者介面 (NDKPI)