TCP cc/window management fixes and debugging
[vpp.git] / src / svm / svm_fifo.h
index 70624b7..80e5b0f 100644 (file)
@@ -44,12 +44,16 @@ typedef struct
 
 typedef struct
 {
+  volatile u32 cursize;                /**< current fifo size */
+  u32 nitems;
+    CLIB_CACHE_LINE_ALIGN_MARK (end_cursize);
+
   pthread_mutex_t mutex;       /* 8 bytes */
   pthread_cond_t condvar;      /* 8 bytes */
-  u32 owner_pid;
   svm_lock_tag_t tag;
-  volatile u32 cursize;
-  u32 nitems;
+
+  volatile u8 has_event;       /**< non-zero if deq event exists */
+  u32 owner_pid;
 
   /* Backpointers */
   u32 server_session_index;
@@ -103,7 +107,7 @@ svm_fifo_max_dequeue (svm_fifo_t * f)
 static inline u32
 svm_fifo_max_enqueue (svm_fifo_t * f)
 {
-  return f->nitems - f->cursize;
+  return f->nitems - svm_fifo_max_dequeue (f);
 }
 
 static inline u8
@@ -112,6 +116,28 @@ svm_fifo_has_ooo_data (svm_fifo_t * f)
   return f->ooos_list_head != OOO_SEGMENT_INVALID_INDEX;
 }
 
+/**
+ * Sets fifo event flag.
+ *
+ * @return 1 if flag was not set.
+ */
+always_inline u8
+svm_fifo_set_event (svm_fifo_t * f)
+{
+  /* Probably doesn't need to be atomic. Still, better avoid surprises */
+  return __sync_lock_test_and_set (&f->has_event, 1) == 0;
+}
+
+/**
+ * Unsets fifo event flag.
+ */
+always_inline void
+svm_fifo_unset_event (svm_fifo_t * f)
+{
+  /* Probably doesn't need to be atomic. Still, better avoid surprises */
+  __sync_lock_test_and_set (&f->has_event, 0);
+}
+
 svm_fifo_t *svm_fifo_create (u32 data_size_in_bytes);
 
 int svm_fifo_enqueue_nowait (svm_fifo_t * f, int pid, u32 max_bytes,