summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2023-08-15 11:52:49 -0400
committerGitHub <noreply@github.com>2023-08-15 11:52:49 -0400
commit77014daf3a88f4a4e2874db93e4b3915937f20ee (patch)
tree58461293771e230d31025f8e00b248deb6383ab8 /lib
parent2bc2ff61c88286585bb86ae8f799872aaf0a0077 (diff)
parentadca5c22c573f17b09b96a0994953c8f643fd301 (diff)
Merge pull request #14016 from mjstapp/event_exec_ptr
* : include event ptr in event_execute api
Diffstat (limited to 'lib')
-rw-r--r--lib/bfd.c4
-rw-r--r--lib/event.c11
-rw-r--r--lib/frrevent.h7
-rw-r--r--lib/wheel.c2
4 files changed, 15 insertions, 9 deletions
diff --git a/lib/bfd.c b/lib/bfd.c
index cc6d09a60f..8c3246ff9a 100644
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -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,