- /* *INDENT-OFF* */
- SESSION_EVT_DBG(SESSION_EVT_ENQ, s, ({
- ed->data[0] = FIFO_EVENT_APP_RX;
- ed->data[1] = svm_fifo_max_dequeue (s->server_rx_fifo);
- }));
- /* *INDENT-ON* */
+ SESSION_EVT (SESSION_EVT_ENQ, s, svm_fifo_max_dequeue_prod (s->rx_fifo));
+
+ s->flags &= ~SESSION_F_RX_EVT;
+
+ /* Application didn't confirm accept yet */
+ if (PREDICT_FALSE (s->session_state == SESSION_STATE_ACCEPTING))
+ return 0;
+
+ if (PREDICT_FALSE (app_worker_lock_and_send_event (app_wrk, s,
+ SESSION_IO_EVT_RX)))
+ return -1;
+
+ if (PREDICT_FALSE (n_subscribers))
+ {
+ s = session_get (session_index, vlib_get_thread_index ());
+ return session_notify_subscribers (app_wrk->app_index, s,
+ s->rx_fifo, SESSION_IO_EVT_RX);
+ }
+
+ return 0;
+}
+
+int
+session_enqueue_notify (session_t * s)
+{
+ return session_enqueue_notify_inline (s);
+}
+
+static void
+session_enqueue_notify_rpc (void *arg)
+{
+ u32 session_index = pointer_to_uword (arg);
+ session_t *s;
+
+ s = session_get_if_valid (session_index, vlib_get_thread_index ());
+ if (!s)
+ return;
+
+ session_enqueue_notify (s);
+}
+
+/**
+ * Like session_enqueue_notify, but can be called from a thread that does not
+ * own the session.
+ */
+void
+session_enqueue_notify_thread (session_handle_t sh)
+{
+ u32 thread_index = session_thread_from_handle (sh);
+ u32 session_index = session_index_from_handle (sh);