From 7cf80e08b61c7c48ab834af23b3c7761634e63d2 Mon Sep 17 00:00:00 2001 From: "Keith Burns (alagalah)" Date: Thu, 8 Mar 2018 16:46:25 -0800 Subject: [PATCH] VCL event handling changes - added vce_get_event_handler() - added check for event before blocking on mutex in vppcom_session_accept() Change-Id: I8e19ea5fcbaa40279cb28152b9923ca8f1328670 Signed-off-by: Keith Burns (alagalah) --- src/vcl/vcl_event.c | 15 +++++++++++++++ src/vcl/vcl_event.h | 10 ++++++++++ src/vcl/vppcom.c | 3 ++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/vcl/vcl_event.c b/src/vcl/vcl_event.c index 65d28707607..64f55b9fb0b 100644 --- a/src/vcl/vcl_event.c +++ b/src/vcl/vcl_event.c @@ -79,6 +79,21 @@ vce_get_event_from_index(vce_event_thread_t *evt, u32 ev_idx) return ev; } +vce_event_handler_reg_t * +vce_get_event_handler (vce_event_thread_t *evt, vce_event_key_t *evk) +{ + vce_event_handler_reg_t *handler = 0; + uword *p; + + clib_spinlock_lock (&evt->handlers_lockp); + p = hash_get (evt->handlers_index_by_event_key, evk->as_u64); + if (p) + handler = pool_elt_at_index (evt->vce_event_handlers, p[0]); + clib_spinlock_unlock (&evt->handlers_lockp); + + return handler; +} + vce_event_handler_reg_t * vce_register_handler (vce_event_thread_t *evt, vce_event_key_t *evk, vce_event_callback_t cb) diff --git a/src/vcl/vcl_event.h b/src/vcl/vcl_event.h index 7b64ede6ae1..a2e247e8d7c 100644 --- a/src/vcl/vcl_event.h +++ b/src/vcl/vcl_event.h @@ -100,6 +100,16 @@ void vce_clear_event (vce_event_thread_t *evt, vce_event_t *ev); */ vce_event_t * vce_get_event_from_index(vce_event_thread_t *evt, u32 ev_idx); +/** + * @brief vce_get_event_handler() + * - returns handler if exists or 0 + * @param evt - vce_event_thread_t - event system state + * @param evk - event key + * @return vce_event_handler_reg_t * + */ +vce_event_handler_reg_t * vce_get_event_handler (vce_event_thread_t *evt, + vce_event_key_t *evk); + /** * @brief vce_register_handler * - used by functions who need to be notified that an event has occurred diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 1f9857676e2..4dea4aa3292 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -2754,7 +2754,8 @@ vppcom_session_accept (uint32_t listen_session_index, vppcom_endpt_t * ep, reg = vce_register_handler (&vcm->event_thread, &evk, vce_connect_request_handler_fn); - ev = 0; + ev = vce_get_event_from_index (&vcm->event_thread, reg->ev_idx); + pthread_mutex_lock (®->handler_lock); while (!ev) { -- 2.16.6