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)
+ vce_event_callback_t cb, void *cb_args)
{
vce_event_handler_reg_t *handler;
vce_event_handler_reg_t *old_handler = 0;
handler->replaced_handler_idx = (p) ? p[0] : ~0;
handler->ev_idx = ~0; //This will be set by the event thread if event happens
handler->evk = evk->as_u64;
+ handler->handler_fn_args = cb_args;
hash_set (evt->handlers_index_by_event_key, evk->as_u64, handler_index);
vce_event_handler_reg_t *handler;
uword *p;
+ pthread_mutex_lock (&(evt->generator_lock));
+ clib_spinlock_lock (&(evt->events_lockp));
evt->recycle_event = 1; // Used for recycling events with no handlers
-
+ clib_spinlock_unlock (&(evt->events_lockp));
do
{
- pthread_mutex_lock (&(evt->generator_lock));
while ( (clib_fifo_elts (evt->event_index_fifo) == 0) ||
evt->recycle_event)
{
+ clib_spinlock_lock (&(evt->events_lockp));
evt->recycle_event = 0;
+ clib_spinlock_unlock (&(evt->events_lockp));
pthread_cond_wait (&(evt->generator_cond),
&(evt->generator_lock));
}
clib_fifo_sub1 (evt->event_index_fifo, ev_idx);
ev = pool_elt_at_index (evt->vce_events, ev_idx);
- clib_spinlock_unlock (&(evt->events_lockp));
-
ASSERT(ev);
clib_spinlock_lock (&evt->handlers_lockp);
* I don't know either, so lets try recycling the event */
clib_fifo_add1 (evt->event_index_fifo, ev_idx);
evt->recycle_event = 1;
+ clib_spinlock_unlock (&(evt->events_lockp));
clib_spinlock_unlock (&evt->handlers_lockp);
- goto unlock;
+ pthread_mutex_unlock (&(evt->generator_lock));
}
- handler = pool_elt_at_index (evt->vce_event_handlers, p[0]);
- handler->ev_idx = ev_idx;
+ else
+ {
+ handler = pool_elt_at_index (evt->vce_event_handlers, p[0]);
+ handler->ev_idx = ev_idx;
- clib_spinlock_unlock (&evt->handlers_lockp);
+ clib_spinlock_unlock (&(evt->events_lockp));
+ clib_spinlock_unlock (&evt->handlers_lockp);
+ pthread_mutex_unlock (&(evt->generator_lock));
- (handler->handler_fn)(handler);
+ (handler->handler_fn)(handler);
+ }
- unlock:
- pthread_mutex_unlock (&(evt->generator_lock));
+ pthread_mutex_lock (&(evt->generator_lock));
}
while (1);
return NULL;
return pthread_create (&(evt->thread), NULL /* attr */ ,
vce_event_thread_fn, evt);
-}
\ No newline at end of file
+}