X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvcl_event.h;h=21884665075d9ec019ccd39759b9782f150db5fb;hb=410bcca41c1a3e7c3d4b4c2940120f9b21732d49;hp=9380f73f77d0a8c89bca7b97aa6578a62f9cf36b;hpb=3cf2d6403dd90083fe2c678c03565f6f483de9e3;p=vpp.git diff --git a/src/vcl/vcl_event.h b/src/vcl/vcl_event.h index 9380f73f77d..21884665075 100644 --- a/src/vcl/vcl_event.h +++ b/src/vcl/vcl_event.h @@ -39,8 +39,8 @@ typedef union vce_event_key_ typedef struct vce_event_ { vce_event_key_t evk; - u32 refcnt; - void *data; + u32 recycle; + u64 data[2]; // Hard code size to avoid allocator thrashing. } vce_event_t; typedef void (*vce_event_callback_t) (void *reg /*vce_event_handler_reg_t* */); @@ -51,7 +51,9 @@ typedef struct vce_event_handler_reg_ pthread_mutex_t handler_lock; pthread_cond_t handler_cond; u32 ev_idx; + u64 evk; //Event key u32 replaced_handler_idx; + void *handler_fn_args; } vce_event_handler_reg_t; typedef struct vce_event_thread_ @@ -85,9 +87,9 @@ int vce_generate_event (vce_event_thread_t *evt, u32 ev_idx); * - removes event from event_pool * * @param evt - vce_event_thread_t - event system state - * @param ev - vce_event_t - event to remove + * @param ev_idx - u32 - index of event to remove */ -void vce_clear_event (vce_event_thread_t *evt, vce_event_t *ev); +void vce_clear_event (vce_event_thread_t *evt, u32 ev_idx); /** * @brief vce_get_event_from_index() @@ -99,6 +101,30 @@ 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_data() + * + * @param ev - vce_event_t * - event + * @param data_size - u32 - required size of data + * + * @return vce_event_t * + */ +always_inline void * vce_get_event_data(vce_event_t *ev, u32 data_size) +{ + ASSERT(sizeof(ev->data) >= data_size); + return (&ev->data); +} + +/** + * @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 @@ -110,12 +136,14 @@ vce_event_t * vce_get_event_from_index(vce_event_thread_t *evt, u32 ev_idx); * @param evk - vce_event_key_t current an eventID from enum in consumer and * sessionID * @param cb - vce_event_callback_t function to handle event + * @param cb_args - args that the callback needs passed back to it. * @return vce_handler_reg_t - the function that needs event notification * needs to block on a condvar mutex to reduce spin. That is in here. */ vce_event_handler_reg_t * vce_register_handler (vce_event_thread_t *evt, vce_event_key_t *evk, - vce_event_callback_t cb); + vce_event_callback_t cb, + void *cb_args); /** * @brief vce_unregister_handler @@ -124,10 +152,11 @@ vce_event_handler_reg_t * vce_register_handler (vce_event_thread_t *evt, * - if this handler replaced an existing one, re-instate it. * * @param evt - vce_event_thread_t - event system state - * @param ev - vce_event_t - event to remove + * @param handler - handler to be unregistered * @return success/failure rv */ -int vce_unregister_handler (vce_event_thread_t *evt, vce_event_t *ev); +int vce_unregister_handler (vce_event_thread_t *evt, + vce_event_handler_reg_t *handler); /** * @brief vce_event_thread_fn