ip: Replace Sematics for Interface IP addresses
[vpp.git] / src / svm / message_queue.c
index a40c4a4..b381173 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <svm/message_queue.h>
 #include <vppinfra/mem.h>
+#include <vppinfra/format.h>
 #include <sys/eventfd.h>
 
 static inline svm_msg_q_ring_t *
@@ -127,11 +128,6 @@ svm_msg_q_lock_and_alloc_msg_w_ring (svm_msg_q_t * mq, u32 ring_index,
          return -2;
        }
       *msg = svm_msg_q_alloc_msg_w_ring (mq, ring_index);
-      if (PREDICT_FALSE (svm_msg_q_msg_is_invalid (msg)))
-       {
-         svm_msg_q_unlock (mq);
-         return -2;
-       }
     }
   else
     {
@@ -174,6 +170,7 @@ void
 svm_msg_q_free_msg (svm_msg_q_t * mq, svm_msg_q_msg_t * msg)
 {
   svm_msg_q_ring_t *ring;
+  int need_signal;
 
   ASSERT (vec_len (mq->rings) > msg->ring_index);
   ring = &mq->rings[msg->ring_index];
@@ -187,7 +184,12 @@ svm_msg_q_free_msg (svm_msg_q_t * mq, svm_msg_q_msg_t * msg)
       /* for now, expect messages to be processed in order */
       ASSERT (0);
     }
+
+  need_signal = ring->cursize == ring->nitems;
   clib_atomic_fetch_sub (&ring->cursize, 1);
+
+  if (PREDICT_FALSE (need_signal))
+    svm_queue_send_signal (mq->q, 0);
 }
 
 static int
@@ -270,6 +272,19 @@ svm_msg_q_alloc_producer_eventfd (svm_msg_q_t * mq)
   return 0;
 }
 
+u8 *
+format_svm_msg_q (u8 * s, va_list * args)
+{
+  svm_msg_q_t *mq = va_arg (*args, svm_msg_q_t *);
+  s = format (s, " [Q:%d/%d]", mq->q->cursize, mq->q->maxsize);
+  for (u32 i = 0; i < vec_len (mq->rings); i++)
+    {
+      s = format (s, " [R%d:%d/%d]", i, mq->rings[i].cursize,
+                 mq->rings[i].nitems);
+    }
+  return s;
+}
+
 /*
  * fd.io coding-style-patch-verification: ON
  *