TCP proxy prototype
[vpp.git] / src / svm / svm_fifo_segment.c
index a01e26e..c04b9d8 100644 (file)
@@ -105,7 +105,7 @@ svm_fifo_segment_create (svm_fifo_segment_create_args_t * a)
   s->ssvm.ssvm_size = a->segment_size;
   s->ssvm.i_am_master = 1;
   s->ssvm.my_pid = getpid ();
-  s->ssvm.name = format (0, "%s", a->segment_name);
+  s->ssvm.name = format (0, "%s%c", a->segment_name, 0);
   s->ssvm.requested_va = sm->next_baseva;
 
   rv = ssvm_master_init (&s->ssvm, s - sm->segments);
@@ -192,7 +192,7 @@ svm_fifo_segment_create_process_private (svm_fifo_segment_create_args_t * a)
       s->ssvm.ssvm_size = ~0;
       s->ssvm.i_am_master = 1;
       s->ssvm.my_pid = getpid ();
-      s->ssvm.name = (u8 *) a->segment_name;
+      s->ssvm.name = format (0, "%s%c", a->segment_name, 0);
       s->ssvm.requested_va = ~0;
 
       /* Allocate a [sic] shared memory header, in process memory... */
@@ -240,7 +240,7 @@ svm_fifo_segment_attach (svm_fifo_segment_create_args_t * a)
 
   s->ssvm.ssvm_size = a->segment_size;
   s->ssvm.my_pid = getpid ();
-  s->ssvm.name = (u8 *) a->segment_name;
+  s->ssvm.name = format (0, "%s%c", a->segment_name, 0);
   s->ssvm.requested_va = sm->next_baseva;
 
   rv = ssvm_slave_init (&s->ssvm, sm->timeout_in_seconds);
@@ -296,6 +296,7 @@ svm_fifo_segment_alloc_fifo (svm_fifo_segment_private_t * s,
          memset (f, 0, sizeof (*f));
          f->nitems = data_size_in_bytes;
          f->ooos_list_head = OOO_SEGMENT_INVALID_INDEX;
+         f->refcnt = 1;
          goto found;
        }
       /* FALLTHROUGH */
@@ -344,6 +345,10 @@ svm_fifo_segment_free_fifo (svm_fifo_segment_private_t * s, svm_fifo_t * f,
   svm_fifo_segment_header_t *fsh;
   void *oldheap;
 
+  ASSERT (f->refcnt > 0);
+
+  if (--f->refcnt > 0)
+    return;
 
   sh = s->ssvm.sh;
   fsh = (svm_fifo_segment_header_t *) sh->opaque[0];