NDKPI 完成处理要求

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

NdkGetCqResults、NdkGetCqResultsEx 和 NdkArmCq 函数的规则

客户程序将始终在同一完成队列(CQ)对象(NDK_CQ)上序列化对这些提供者函数的调用:

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

由于远程 NdkSendAndInvalidateNDK_FN_SEND_AND_INVALIDATE)调用引起的 NdkOperationTypeReceiveAndInvalidate 完成,仍需通过 NdkGetCqResults(而非 NdkGetCqResultsExn)进行检索。 这样做必须仍然使接收方上的指定令牌失效,但不会通知接收方此无效(使用者必须使用 NdkGetCqResultsEx 获取此信息)。 稍后的同一令牌的NdkInvalidateNDK_FN_INVALIDATE)调用将像往常一样失败。

通知回调规则

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

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

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

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

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

第二臂 ANY 第二机械臂错误 第二分支收到请求

第一轴 ANY

ANY

ANY

ANY

第一臂错误

ANY

错误

请求

第一臂请求

ANY

征集

请求

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