Restructure some files in LB to src/vnet to reuse
[vpp.git] / src / vnet / util / refcount.c
similarity index 71%
rename from src/plugins/lb/refcount.c
rename to src/vnet/util/refcount.c
index 6f01ab5..a7b525d 100644 (file)
  * limitations under the License.
  */
 
-#include <lb/refcount.h>
+#include <vnet/util/refcount.h>
 
 void __vlib_refcount_resize(vlib_refcount_per_cpu_t *per_cpu, u32 size)
 {
   u32 *new_counter = 0, *old_counter;
   vec_validate(new_counter, size);
-  memcpy(new_counter, per_cpu->counters, per_cpu->length);
+  vlib_refcount_lock(per_cpu->counter_lock);
+  memcpy(new_counter, per_cpu->counters, vec_len(per_cpu->counters)*4);
   old_counter = per_cpu->counters;
   per_cpu->counters = new_counter;
+  vlib_refcount_unlock(per_cpu->counter_lock);
   CLIB_MEMORY_BARRIER();
-  per_cpu->length = vec_len(new_counter);
   vec_free(old_counter);
 }
 
@@ -33,8 +34,12 @@ u64 vlib_refcount_get(vlib_refcount_t *r, u32 index)
   vlib_thread_main_t *tm = vlib_get_thread_main ();
   u32 thread_index;
   for (thread_index = 0; thread_index < tm->n_vlib_mains; thread_index++) {
-    if (r->per_cpu[thread_index].length > index)
-      count += r->per_cpu[thread_index].counters[index];
+    vlib_refcount_lock(r->per_cpu[thread_index].counter_lock);
+    if (index < vec_len(r->per_cpu[thread_index].counters))
+      {
+        count += r->per_cpu[thread_index].counters[index];
+      }
+    vlib_refcount_unlock(r->per_cpu[thread_index].counter_lock);
   }
   return count;
 }