Requisitos de control de finalización de NDKPI
Los consumidores de NDK y los proveedores de NDK deben cumplir estos requisitos para el control de finalización de NDKPI.
Reglas para las funciones NdkGetCqResults, NdkGetCqResultsEx y NdkArmCq
El consumidor siempre serializará sus llamadas a estas funciones de proveedor en el mismo objeto de cola de finalización (CQ) (NDK_CQ):
- NdkGetCqResults (NDK_FN_GET_CQ_RESULTS)
- NdkGetCqResultsEx (NDK_FN_GET_CQ_RESULTS_EX)
- NdkArmCq (NDK_FN_ARM_CQ)
Esto significa no solo que el consumidor nunca llamará a la misma función de proveedor varias veces simultáneamente, sino que nunca llamará a ninguna combinación de estas funciones simultáneamente en el mismo CQ desde varios subprocesos.
Una finalización de NdkOperationTypeReceiveAndInvalidate que se produce como resultado de una llamada remota a NdkSendAndInvalidate (NDK_FN_SEND_AND_INVALIDATE) todavía debe recuperarse mediante NdkGetCqResults (no NdkGetCqResultsExn). Si lo hace, debe invalidar el token especificado en el receptor, pero no notificará al consumidor receptor de esta invalidación (el consumidor debe usar NdkGetCqResultsEx para obtener esta información). Se producirá un error en NdkInvalidate (NDK_FN_INVALIDATE) posterior para el mismo token, como de costumbre.
Reglas para devoluciones de llamada de notificación
El proveedor debe llamar a la devolución de llamada NdkCqNotificationCallback (NDK_FN_CQ_NOTIFICATION_CALLBACK) solo una vez y solo después de que el consumidor haya armado la devolución de llamada NdkCqNotificationCallback llamando a NdkArmCq. Es decir, el proveedor debe borrar el brazo y llamar a la devolución de llamada NdkCqNotificationCallback cuando se produzcan las condiciones para llamar a la devolución de llamada NdkCqNotificationCallback (es decir, cuando las finalizaciones de solicitudes se ponen en cola en el CQ).
Si ya hay finalizaciones presentes en el CQ cuando el consumidor llama a NdkArmCq, el proveedor se comportará de la siguiente manera:
- Si se llamó al menos a una de las finalizaciones en el CQ desde que se llamó a la última devolución de llamada de NdkCqNotificationCallback , el proveedor debe satisfacer la solicitud arm inmediatamente (consulte a continuación para conocer los requisitos de serialización).
- Sin embargo, si todas las finalizaciones del CQ estaban presentes también cuando se llamó a la última devolución de llamada NdkCqNotificationCallback (es decir, el consumidor llamó a NdkArmCq sin quitar todas las finalizaciones y no se colocaron nuevas finalizaciones en el CQ), el proveedor puede satisfacer la solicitud arm inmediatamente.
Cuando el proveedor necesita llamar a la devolución de llamada NdkCqNotificationCallback , si ya hay una devolución de llamada NdkCqNotificationCallback en curso, el proveedor debe aplazar la invocación de la devolución de llamada NdkCqNotificationCallback hasta después de que la llamada existente a la devolución de llamada NdkCqNotificationCallback devuelva el control al proveedor. En otras palabras, el proveedor es responsable de serializar las devoluciones de llamada de NdkCqNotificationCallback .
En la tabla siguiente se muestra el tipo arm resultante si se llama a NdkArmCq una segunda vez antes de que se cumpla una solicitud de NdkArmCq anterior:
2º brazo ANY | 2º brazo ERRORES | 2º brazo SOLICITED | |
---|---|---|---|
1º brazo ANY |
ANY |
ANY |
ANY |
1º brazo ERRORES |
ANY |
ERRORES |
SOLICITADO |
1º brazo SOLICITADO |
ANY |
SOLICITADO |
SOLICITADO |