diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/bfd.c | 4 | ||||
| -rw-r--r-- | lib/event.c | 11 | ||||
| -rw-r--r-- | lib/frrevent.h | 7 | ||||
| -rw-r--r-- | lib/wheel.c | 2 |
4 files changed, 15 insertions, 9 deletions
@@ -541,7 +541,7 @@ static void _bfd_sess_remove(struct bfd_session_params *bsp) /* Send request to remove any session. */ bsp->lastev = BSE_UNINSTALL; - event_execute(bsglobal.tm, _bfd_sess_send, bsp, 0); + event_execute(bsglobal.tm, _bfd_sess_send, bsp, 0, NULL); } void bfd_sess_free(struct bfd_session_params **bsp) @@ -894,7 +894,7 @@ int zclient_bfd_session_replay(ZAPI_CALLBACK_ARGS) /* Ask for installation. */ bsp->lastev = BSE_INSTALL; - event_execute(bsglobal.tm, _bfd_sess_send, bsp, 0); + event_execute(bsglobal.tm, _bfd_sess_send, bsp, 0, NULL); } return 0; diff --git a/lib/event.c b/lib/event.c index a8eb89f48d..b971bd70e6 100644 --- a/lib/event.c +++ b/lib/event.c @@ -1491,9 +1491,9 @@ void event_cancel(struct event **thread) cr->thread = *thread; listnode_add(master->cancel_req, cr); do_event_cancel(master); - } - *thread = NULL; + *thread = NULL; + } } /** @@ -2066,10 +2066,15 @@ void event_call(struct event *thread) /* Execute thread */ void _event_execute(const struct xref_eventsched *xref, struct event_loop *m, - void (*func)(struct event *), void *arg, int val) + void (*func)(struct event *), void *arg, int val, + struct event **eref) { struct event *thread; + /* Cancel existing scheduled task TODO -- nice to do in 1 lock cycle */ + if (eref) + event_cancel(eref); + /* Get or allocate new thread to execute. */ frr_with_mutex (&m->mtx) { thread = thread_get(m, EVENT_EVENT, func, arg, xref); diff --git a/lib/frrevent.h b/lib/frrevent.h index 2b0c52bb51..fe33ffd1f2 100644 --- a/lib/frrevent.h +++ b/lib/frrevent.h @@ -195,7 +195,7 @@ struct cpu_event_history { _xref_t_a(timer_tv, TIMER, m, f, a, v, t) #define event_add_event(m, f, a, v, t) _xref_t_a(event, EVENT, m, f, a, v, t) -#define event_execute(m, f, a, v) \ +#define event_execute(m, f, a, v, p) \ ({ \ static const struct xref_eventsched _xref __attribute__( \ (used)) = { \ @@ -205,7 +205,7 @@ struct cpu_event_history { .event_type = EVENT_EXECUTE, \ }; \ XREF_LINK(_xref.xref); \ - _event_execute(&_xref, m, f, a, v); \ + _event_execute(&_xref, m, f, a, v, p); \ }) /* end */ /* Prototypes. */ @@ -241,7 +241,8 @@ extern void _event_add_event(const struct xref_eventsched *xref, extern void _event_execute(const struct xref_eventsched *xref, struct event_loop *master, - void (*fn)(struct event *), void *arg, int val); + void (*fn)(struct event *), void *arg, int val, + struct event **eref); extern void event_cancel(struct event **event); extern void event_cancel_async(struct event_loop *m, struct event **eptr, diff --git a/lib/wheel.c b/lib/wheel.c index e17995c64a..2520e81d49 100644 --- a/lib/wheel.c +++ b/lib/wheel.c @@ -57,7 +57,7 @@ static void wheel_timer_thread(struct event *t) wheel = EVENT_ARG(t); - event_execute(wheel->master, wheel_timer_thread_helper, wheel, 0); + event_execute(wheel->master, wheel_timer_thread_helper, wheel, 0, NULL); } struct timer_wheel *wheel_init(struct event_loop *master, int period, |
