+static void
+session_program_transport_close (stream_session_t * s)
+{
+ u32 thread_index = vlib_get_thread_index ();
+ session_manager_worker_t *wrk;
+ session_event_t *evt;
+
+ /* If we are in the handler thread, or being called with the worker barrier
+ * held, just append a new event to pending disconnects vector. */
+ if (vlib_thread_is_main_w_barrier () || thread_index == s->thread_index)
+ {
+ wrk = session_manager_get_worker (s->thread_index);
+ vec_add2 (wrk->pending_disconnects, evt, 1);
+ clib_memset (evt, 0, sizeof (*evt));
+ evt->session_handle = session_handle (s);
+ evt->event_type = FIFO_EVENT_DISCONNECT;
+ }
+ else
+ session_send_ctrl_evt_to_thread (s, FIFO_EVENT_DISCONNECT);
+}
+