NDKPI 完成处理要求

NDK 使用者和 NDK 提供程序必须遵循 NDKPI 完成处理的这些要求。

NdkGetCqResults、NdkGetCqResultsEx 和 NdkArmCq Functions 的规则

使用者始终在 CQ) 对象 ( (NDK_CQ) 的 完成队列中序列化对这些提供程序函数的调用:

这不仅意味着使用者永远不会多次同时调用同一提供程序函数,而且它永远不会从多个线程在同一 CQ 上同时调用这些函数的任意组合。

由于远程 NdkSendAndInvalidate () NDK_FN_SEND_AND_INVALIDATE调用而发生的 NdkOperationTypeReceiveAndInvalidate 完成,仍必须使用 NdkGetCqResults (而不是 NdkGetCqResultsEx n) 检索。 这样做必须仍然使接收方上的指定令牌失效,但不会通知接收使用者此失效, (使用者必须使用 NdkGetCqResultsEx) 获取此信息。 以后的 NdkInvalidate (NDK_FN_INVALIDATE) 相同令牌将像往常一样失败。

通知回调规则

提供程序必须调用 NdkCqNotificationCallback (NDK_FN_CQ_NOTIFICATION_CALLBACK) 回调一次,并且仅在使用者通过调用 NdkCqNotificationCq 武装 NdkCotificationCallback 回调之后调用 也就是说,当调用 NdkCqNotificationCallback 回调的条件 (时,当请求完成在 CQ) 中排队时,提供程序必须清除 arm 并调用 NdkCqNotificationCallback 回调。

如果在使用者调用 NdkArmCq 时 CQ 中已存在完成,则提供程序的行为如下所示:

  • 如果自上次调用 NdkCqNotificationCallback 回调以来,至少有一个完成是新放入 CQ 的,则提供程序必须立即满足 arm 请求, (请参阅下文,了解) 的序列化要求。
  • 但是,如果在调用 (最后一个 NdkCqNotificationCallback 回调时也存在 CQ 中的所有完成,则使用者调用 NdkArmCq 而不删除所有完成,并且没有新的完成放入 CQ) ,则提供程序可以立即满足 arm 请求。

当提供程序需要调用 NdkCqNotificationCallback 回调时,如果已有 NdkCqNotificationCallback 回调正在进行中,则提供程序必须推迟 NdkCqNotificationCallback 回调的调用,直到对 NdkCqNotificationCallback 回调的现有调用将控制权返回到提供程序之后。 换句话说,提供程序负责序列化 NdkCqNotificationCallback 回调。

下表显示了在满足上一个 NdkArmCq 请求之前第二次调用 NdkArmCq 时生成的 arm 类型:

第二臂 ANY 第二个臂错误 第 2 个 ARM SOLICITED

第一臂 ANY

ANY

ANY

ANY

第一臂错误

ANY

错误

征求

第一臂请求

ANY

征求

征求

网络直接内核提供程序接口 (NDKPI)