+ segment_manager_main_t *smm = &segment_manager_main;
+
+ if (ssvm_type (&fs->ssvm) != SSVM_SEGMENT_PRIVATE)
+ clib_valloc_free (&smm->va_allocator, fs->ssvm.requested_va);
+
+ ssvm_delete (&fs->ssvm);
+
+ if (CLIB_DEBUG)
+ memset (fs, 0xfb, sizeof (*fs));
+ pool_put (sm->segments, fs);
+}
+
+/**
+ * Removes segment after acquiring writer lock
+ */
+static inline void
+segment_manager_lock_and_del_segment (segment_manager_t * sm, u32 fs_index)
+{
+ svm_fifo_segment_private_t *fs;
+ u8 is_prealloc;
+
+ clib_rwlock_writer_lock (&sm->segments_rwlock);
+ fs = segment_manager_get_segment (sm, fs_index);
+ is_prealloc = svm_fifo_segment_flags (fs) & FIFO_SEGMENT_F_IS_PREALLOCATED;
+ if (is_prealloc && !segment_manager_app_detached (sm))
+ {
+ clib_rwlock_writer_unlock (&sm->segments_rwlock);
+ return;
+ }
+
+ segment_manager_del_segment (sm, fs);
+ clib_rwlock_writer_unlock (&sm->segments_rwlock);
+}
+
+/**
+ * Reads a segment from the segment manager's pool without lock
+ */
+svm_fifo_segment_private_t *
+segment_manager_get_segment (segment_manager_t * sm, u32 segment_index)
+{
+ return pool_elt_at_index (sm->segments, segment_index);