+ if (PREDICT_FALSE (svm_msg_q_ring_is_full (mq, SESSION_MQ_IO_EVT_RING)))
+ {
+ svm_msg_q_unlock (mq);
+ return -2;
+ }
+ msg = svm_msg_q_alloc_msg_w_ring (mq, SESSION_MQ_IO_EVT_RING);
+ if (PREDICT_FALSE (svm_msg_q_msg_is_invalid (&msg)))
+ {
+ svm_msg_q_unlock (mq);
+ return -2;
+ }
+ evt = (session_event_t *) svm_msg_q_msg_data (mq, &msg);
+ evt->event_type = evt_type;
+ switch (evt_type)
+ {
+ case SESSION_CTRL_EVT_RPC:
+ evt->rpc_args.fp = data;
+ evt->rpc_args.arg = args;
+ break;
+ case SESSION_IO_EVT_TX:
+ case SESSION_IO_EVT_TX_FLUSH:
+ case SESSION_IO_EVT_BUILTIN_RX:
+ evt->session_index = *(u32 *) data;
+ break;
+ case SESSION_IO_EVT_BUILTIN_TX:
+ case SESSION_CTRL_EVT_CLOSE:
+ evt->session_handle = session_handle ((session_t *) data);
+ break;
+ default:
+ clib_warning ("evt unhandled!");
+ svm_msg_q_unlock (mq);
+ return -1;
+ }
+
+ svm_msg_q_add_and_unlock (mq, &msg);
+ return 0;
+}
+
+int
+session_send_io_evt_to_thread (svm_fifo_t * f, session_evt_type_t evt_type)
+{
+ return session_send_evt_to_thread (&f->master_session_index, 0,
+ f->master_thread_index, evt_type);
+}
+
+int
+session_send_io_evt_to_thread_custom (void *data, u32 thread_index,
+ session_evt_type_t evt_type)
+{
+ return session_send_evt_to_thread (data, 0, thread_index, evt_type);
+}
+
+int
+session_send_ctrl_evt_to_thread (session_t * s, session_evt_type_t evt_type)
+{
+ /* only event supported for now is disconnect */
+ ASSERT (evt_type == SESSION_CTRL_EVT_CLOSE);
+ return session_send_evt_to_thread (s, 0, s->thread_index,
+ SESSION_CTRL_EVT_CLOSE);