+static inline u32
+vls_get_worker_index (void)
+{
+ return vcl_get_worker_index ();
+}
+
+static u32
+vls_shared_data_alloc (void)
+{
+ vls_shared_data_t *vls_shd;
+ u32 shd_index;
+
+ clib_rwlock_writer_lock (&vlsm->shared_data_lock);
+ pool_get_zero (vlsm->shared_data_pool, vls_shd);
+ clib_spinlock_init (&vls_shd->lock);
+ shd_index = vls_shd - vlsm->shared_data_pool;
+ clib_rwlock_writer_unlock (&vlsm->shared_data_lock);
+
+ return shd_index;
+}
+
+static u32
+vls_shared_data_index (vls_shared_data_t * vls_shd)
+{
+ return vls_shd - vlsm->shared_data_pool;
+}
+
+vls_shared_data_t *
+vls_shared_data_get (u32 shd_index)
+{
+ if (pool_is_free_index (vlsm->shared_data_pool, shd_index))
+ return 0;
+ return pool_elt_at_index (vlsm->shared_data_pool, shd_index);
+}
+
+static void
+vls_shared_data_free (u32 shd_index)
+{
+ vls_shared_data_t *vls_shd;
+
+ clib_rwlock_writer_lock (&vlsm->shared_data_lock);
+ vls_shd = vls_shared_data_get (shd_index);
+ clib_spinlock_free (&vls_shd->lock);
+ clib_bitmap_free (vls_shd->listeners);
+ vec_free (vls_shd->workers_subscribed);
+ pool_put (vlsm->shared_data_pool, vls_shd);
+ clib_rwlock_writer_unlock (&vlsm->shared_data_lock);
+}
+
+static inline void
+vls_shared_data_pool_rlock (void)
+{
+ clib_rwlock_reader_lock (&vlsm->shared_data_lock);
+}
+
+static inline void
+vls_shared_data_pool_runlock (void)
+{
+ clib_rwlock_reader_unlock (&vlsm->shared_data_lock);
+}
+