+segment_manager_t *
+segment_manager_get_if_valid (u32 index)
+{
+ if (pool_is_free_index (sm_main.segment_managers, index))
+ return 0;
+ return pool_elt_at_index (sm_main.segment_managers, index);
+}
+
+u32
+segment_manager_index (segment_manager_t * sm)
+{
+ return sm - sm_main.segment_managers;
+}
+
+u8
+segment_manager_has_fifos (segment_manager_t * sm)
+{
+ fifo_segment_t *seg;
+ u8 first = 1;
+
+ /* *INDENT-OFF* */
+ segment_manager_foreach_segment_w_lock (seg, sm, ({
+ if (CLIB_DEBUG && !first && !fifo_segment_has_fifos (seg)
+ && !(fifo_segment_flags (seg) & FIFO_SEGMENT_F_IS_PREALLOCATED))
+ {
+ clib_warning ("segment %d has no fifos!",
+ segment_manager_segment_index (sm, seg));
+ first = 0;
+ }
+ if (fifo_segment_has_fifos (seg))
+ {
+ segment_manager_segment_reader_unlock (sm);
+ return 1;
+ }
+ }));
+ /* *INDENT-ON* */
+
+ return 0;
+}
+
+/**
+ * Initiate disconnects for all sessions 'owned' by a segment manager
+ */
+void
+segment_manager_del_sessions (segment_manager_t * sm)
+{
+ session_handle_t *handles = 0, *handle;
+ fifo_segment_t *fs;
+ session_t *session;
+ int slice_index;
+ svm_fifo_t *f;
+
+ ASSERT (pool_elts (sm->segments) != 0);
+
+ /* Across all fifo segments used by the server */
+ /* *INDENT-OFF* */
+ segment_manager_foreach_segment_w_lock (fs, sm, ({
+ for (slice_index = 0; slice_index < fs->n_slices; slice_index++)
+ {
+ f = fifo_segment_get_slice_fifo_list (fs, slice_index);
+
+ /*
+ * Remove any residual sessions from the session lookup table
+ * Don't bother deleting the individual fifos, we're going to
+ * throw away the fifo segment in a minute.
+ */
+ while (f)
+ {
+ session = session_get_if_valid (f->master_session_index,
+ f->master_thread_index);
+ if (session)
+ vec_add1 (handles, session_handle (session));
+ f = f->next;
+ }
+ }
+
+ /* Instead of removing the segment, test when cleaning up disconnected
+ * sessions if the segment can be removed.
+ */
+ }));
+ /* *INDENT-ON* */
+
+ vec_foreach (handle, handles)
+ session_close (session_get_from_handle (*handle));
+}
+
+int
+segment_manager_try_alloc_fifos (fifo_segment_t * fifo_segment,
+ u32 thread_index,
+ u32 rx_fifo_size, u32 tx_fifo_size,
+ svm_fifo_t ** rx_fifo, svm_fifo_t ** tx_fifo)
+{
+ rx_fifo_size = clib_max (rx_fifo_size, sm_main.default_fifo_size);
+ *rx_fifo = fifo_segment_alloc_fifo_w_slice (fifo_segment, thread_index,
+ rx_fifo_size,
+ FIFO_SEGMENT_RX_FIFO);