+void
+vcl_worker_detach_sessions (vcl_worker_t *wrk)
+{
+ session_event_t *e;
+ vcl_session_t *s;
+ uword *seg_indices_map = 0;
+ u32 seg_index, val, *seg_indices = 0;
+
+ close (wrk->app_api_sock.fd);
+ pool_foreach (s, wrk->sessions)
+ {
+ if (s->session_state == VCL_STATE_LISTEN)
+ {
+ s->session_state = VCL_STATE_LISTEN_NO_MQ;
+ continue;
+ }
+ if ((s->flags & VCL_SESSION_F_IS_VEP) ||
+ s->session_state == VCL_STATE_LISTEN_NO_MQ ||
+ s->session_state == VCL_STATE_CLOSED)
+ continue;
+
+ hash_set (seg_indices_map, s->tx_fifo->segment_index, 1);
+
+ s->session_state = VCL_STATE_DETACHED;
+ vec_add2 (wrk->unhandled_evts_vector, e, 1);
+ e->event_type = SESSION_CTRL_EVT_DISCONNECTED;
+ e->session_index = s->session_index;
+ e->postponed = 1;
+ }
+
+ hash_foreach (seg_index, val, seg_indices_map,
+ ({ vec_add1 (seg_indices, seg_index); }));
+
+ vcl_segment_detach_segments (seg_indices);
+
+ /* Detach worker's mqs segment */
+ vcl_segment_detach (vcl_vpp_worker_segment_handle (wrk->wrk_index));
+
+ vec_free (seg_indices);
+ hash_free (seg_indices_map);
+}
+