vapi: Add option to dispatch with timeout 05/41105/4
authorDau Do <daudo@yahoo.com>
Tue, 11 Jun 2024 02:55:19 +0000 (19:55 -0700)
committerMatthew Smith <mgsmith@netgate.com>
Fri, 14 Jun 2024 19:16:18 +0000 (19:16 +0000)
Type: improvement

Change-Id: I606efc90d9b1b8e2a2590a8b4e0021e2508642b2
Signed-off-by: Dau Do <daudo@yahoo.com>
src/vpp-api/vapi/vapi.c
src/vpp-api/vapi/vapi.h

index 022f023..26c5708 100644 (file)
@@ -1792,14 +1792,15 @@ vapi_verify_msg_size (vapi_msg_id_t id, void *buf, uword buf_size)
 }
 
 vapi_error_e
-vapi_dispatch_one (vapi_ctx_t ctx)
+vapi_dispatch_one_timedwait (vapi_ctx_t ctx, u32 wait_time)
 {
   VAPI_DBG ("vapi_dispatch_one()");
   void *msg;
   uword size;
   svm_q_conditional_wait_t cond =
-    vapi_is_nonblocking (ctx) ? SVM_Q_NOWAIT : SVM_Q_WAIT;
-  vapi_error_e rv = vapi_recv (ctx, &msg, &size, cond, 0);
+    vapi_is_nonblocking (ctx) ? (wait_time ? SVM_Q_TIMEDWAIT : SVM_Q_NOWAIT) :
+                                     SVM_Q_WAIT;
+  vapi_error_e rv = vapi_recv (ctx, &msg, &size, cond, wait_time);
   if (VAPI_OK != rv)
     {
       VAPI_DBG ("vapi_recv failed with rv=%d", rv);
@@ -1846,6 +1847,12 @@ done:
   return rv;
 }
 
+vapi_error_e
+vapi_dispatch_one (vapi_ctx_t ctx)
+{
+  return vapi_dispatch_one_timedwait (ctx, 0);
+}
+
 vapi_error_e
 vapi_dispatch (vapi_ctx_t ctx)
 {
index 970c508..8f092ee 100644 (file)
@@ -222,6 +222,18 @@ vapi_error_e vapi_recv (vapi_ctx_t ctx, void **msg, size_t *msg_size,
  */
 vapi_error_e vapi_wait (vapi_ctx_t ctx);
 
+/**
+ * @brief pick next message sent by vpp and call the appropriate callback
+ *
+ * @note if using block mode, it will be blocked indefinitely until the next
+ * msg available. If using non-blocking mode, it will block for time_wait
+ * seconds until the next msg available if time_wait > 0, or does not block if
+ * time_wait == 0.
+ *
+ * @return VAPI_OK on success, other error code on error
+ */
+vapi_error_e vapi_dispatch_one_timedwait (vapi_ctx_t ctx, u32 wait_time);
+
 /**
  * @brief pick next message sent by vpp and call the appropriate callback
  *
@@ -235,11 +247,11 @@ vapi_error_e vapi_dispatch_one (vapi_ctx_t ctx);
  *
  * @note the dispatch loop is interrupted if any error is encountered or
  * returned from the callback, in which case this error is returned as the
- * result of vapi_dispatch. In this case it might be necessary to call dispatch
- * again to process the remaining messages. Returning VAPI_EUSER from
- * a callback allows the user to break the dispatch loop (and distinguish
- * this case in the calling code from other failures). VAPI never returns
- * VAPI_EUSER on its own.
+ * result of vapi_dispatch. In this case it might be necessary to call
+ * dispatch again to process the remaining messages. Returning VAPI_EUSER
+ * from a callback allows the user to break the dispatch loop (and
+ * distinguish this case in the calling code from other failures). VAPI never
+ * returns VAPI_EUSER on its own.
  *
  * @return VAPI_OK on success, other error code on error
  */