summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/agentx.c5
-rw-r--r--lib/frr_zmq.c22
-rw-r--r--lib/thread.c13
-rw-r--r--lib/thread.h19
-rw-r--r--lib/workqueue.c4
5 files changed, 30 insertions, 33 deletions
diff --git a/lib/agentx.c b/lib/agentx.c
index 7c4bdcbe27..07f146bae4 100644
--- a/lib/agentx.c
+++ b/lib/agentx.c
@@ -130,7 +130,7 @@ static void agentx_events_update(void)
if (thr_fd == fd) {
struct listnode *nextln = listnextnode(ln);
if (!FD_ISSET(fd, &fds)) {
- thread_cancel(thr);
+ thread_cancel(&thr);
list_delete_node(events, ln);
}
ln = nextln;
@@ -151,7 +151,8 @@ static void agentx_events_update(void)
*/
while (ln) {
struct listnode *nextln = listnextnode(ln);
- thread_cancel(listgetdata(ln));
+ thr = listgetdata(ln);
+ thread_cancel(&thr);
list_delete_node(events, ln);
ln = nextln;
}
diff --git a/lib/frr_zmq.c b/lib/frr_zmq.c
index 565936a410..cc11d76700 100644
--- a/lib/frr_zmq.c
+++ b/lib/frr_zmq.c
@@ -190,10 +190,8 @@ int funcname_frrzmq_thread_add_read(struct thread_master *master,
cb->read.cancelled = false;
if (events & ZMQ_POLLIN) {
- if (cb->read.thread) {
- thread_cancel(cb->read.thread);
- cb->read.thread = NULL;
- }
+ thread_cancel(&cb->read.thread);
+
funcname_thread_add_event(master, frrzmq_read_msg, cbp, fd,
&cb->read.thread, funcname, schedfrom,
fromln);
@@ -298,10 +296,8 @@ int funcname_frrzmq_thread_add_write(struct thread_master *master,
cb->write.cancelled = false;
if (events & ZMQ_POLLOUT) {
- if (cb->write.thread) {
- thread_cancel(cb->write.thread);
- cb->write.thread = NULL;
- }
+ thread_cancel(&cb->write.thread);
+
funcname_thread_add_event(master, frrzmq_write_msg, cbp, fd,
&cb->write.thread, funcname,
schedfrom, fromln);
@@ -317,10 +313,8 @@ void frrzmq_thread_cancel(struct frrzmq_cb **cb, struct cb_core *core)
if (!cb || !*cb)
return;
core->cancelled = true;
- if (core->thread) {
- thread_cancel(core->thread);
- core->thread = NULL;
- }
+ thread_cancel(&core->thread);
+
if ((*cb)->read.cancelled && !(*cb)->read.thread
&& (*cb)->write.cancelled && (*cb)->write.thread)
XFREE(MTYPE_ZEROMQ_CB, *cb);
@@ -344,8 +338,8 @@ void frrzmq_check_events(struct frrzmq_cb **cbp, struct cb_core *core,
return;
if (events & event && core->thread && !core->cancelled) {
struct thread_master *tm = core->thread->master;
- thread_cancel(core->thread);
- core->thread = NULL;
+ thread_cancel(&core->thread);
+
thread_add_event(tm, (event == ZMQ_POLLIN ? frrzmq_read_msg
: frrzmq_write_msg),
cbp, cb->fd, &core->thread);
diff --git a/lib/thread.c b/lib/thread.c
index db35a3f031..90c6c6f0a8 100644
--- a/lib/thread.c
+++ b/lib/thread.c
@@ -1163,19 +1163,26 @@ void thread_cancel_event(struct thread_master *master, void *arg)
*
* @param thread task to cancel
*/
-void thread_cancel(struct thread *thread)
+void thread_cancel(struct thread **thread)
{
- struct thread_master *master = thread->master;
+ struct thread_master *master;
+
+ if (thread == NULL || *thread == NULL)
+ return;
+
+ master = (*thread)->master;
assert(master->owner == pthread_self());
frr_with_mutex(&master->mtx) {
struct cancel_req *cr =
XCALLOC(MTYPE_TMP, sizeof(struct cancel_req));
- cr->thread = thread;
+ cr->thread = *thread;
listnode_add(master->cancel_req, cr);
do_thread_cancel(master);
}
+
+ *thread = NULL;
}
/**
diff --git a/lib/thread.h b/lib/thread.h
index c22b2105cd..a581796d30 100644
--- a/lib/thread.h
+++ b/lib/thread.h
@@ -89,6 +89,8 @@ struct thread_master {
pthread_t owner;
};
+typedef struct thread_master event_master;
+
/* Thread itself. */
struct thread {
uint8_t type; /* thread type */
@@ -147,17 +149,10 @@ struct cpu_thread_history {
#define THREAD_FD(X) ((X)->u.fd)
#define THREAD_VAL(X) ((X)->u.val)
-#define THREAD_OFF(thread) \
- do { \
- if (thread) { \
- thread_cancel(thread); \
- thread = NULL; \
- } \
- } while (0)
-
-#define THREAD_READ_OFF(thread) THREAD_OFF(thread)
-#define THREAD_WRITE_OFF(thread) THREAD_OFF(thread)
-#define THREAD_TIMER_OFF(thread) THREAD_OFF(thread)
+#define THREAD_OFF(thread) thread_cancel(&(thread))
+#define THREAD_READ_OFF(thread) thread_cancel(&(thread))
+#define THREAD_WRITE_OFF(thread) thread_cancel(&(thread))
+#define THREAD_TIMER_OFF(thread) thread_cancel(&(thread))
#define debugargdef const char *funcname, const char *schedfrom, int fromln
@@ -207,7 +202,7 @@ extern void funcname_thread_execute(struct thread_master *,
debugargdef);
#undef debugargdef
-extern void thread_cancel(struct thread *);
+extern void thread_cancel(struct thread **event);
extern void thread_cancel_async(struct thread_master *, struct thread **,
void *);
extern void thread_cancel_event(struct thread_master *, void *);
diff --git a/lib/workqueue.c b/lib/workqueue.c
index 54090d0d0f..f8e4677220 100644
--- a/lib/workqueue.c
+++ b/lib/workqueue.c
@@ -104,7 +104,7 @@ void work_queue_free_and_null(struct work_queue **wqp)
struct work_queue *wq = *wqp;
if (wq->thread != NULL)
- thread_cancel(wq->thread);
+ thread_cancel(&(wq->thread));
while (!work_queue_empty(wq)) {
struct work_queue_item *item = work_queue_last_item(wq);
@@ -215,7 +215,7 @@ void workqueue_cmd_init(void)
void work_queue_plug(struct work_queue *wq)
{
if (wq->thread)
- thread_cancel(wq->thread);
+ thread_cancel(&(wq->thread));
wq->thread = NULL;