vcl: fix nonblocking accept with >1 event in the queue 12/23512/3
authorCarl Smith <carl.smith@alliedtelesis.co.nz>
Tue, 12 Nov 2019 01:57:37 +0000 (14:57 +1300)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Thu, 28 Nov 2019 09:51:10 +0000 (09:51 +0000)
We discard unwanted events until we get an ACCEPTED.
But if we are non-blocking we need to check the queue
length every time and EAGAIN if empty before waiting.

Type: fix

Signed-off-by: Carl Smith <carl.smith@alliedtelesis.co.nz>
Change-Id: Ie0c7e5cb00f0d37d2e1534f8bb384221ff56f2e3
(cherry picked from commit 592a909a302262cf4088a5468b8e427f577725e8)

src/vcl/vppcom.c

index 349e27e..263fa91 100644 (file)
@@ -1464,11 +1464,11 @@ vppcom_session_accept (uint32_t listen_session_handle, vppcom_endpt_t * ep,
 
   is_nonblocking = VCL_SESS_ATTR_TEST (listen_session->attr,
                                       VCL_SESS_ATTR_NONBLOCK);
-  if (svm_msg_q_is_empty (wrk->app_event_queue) && is_nonblocking)
-    return VPPCOM_EAGAIN;
-
   while (1)
     {
+      if (svm_msg_q_is_empty (wrk->app_event_queue) && is_nonblocking)
+       return VPPCOM_EAGAIN;
+
       if (svm_msg_q_sub (wrk->app_event_queue, &msg, SVM_Q_WAIT, 0))
        return VPPCOM_EAGAIN;