summaryrefslogtreecommitdiffstats
path: root/lib/frr_pthread.c
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2019-08-09 20:01:06 +0200
committerQuentin Young <qlyoung@cumulusnetworks.com>2019-09-16 18:12:00 +0200
commit54baf432f064f30e22b2c5873a54ac6f407131ce (patch)
treee447c45fbcae24b74dee539efc0f77b679cc277c /lib/frr_pthread.c
parentMerge pull request #4834 from srimohans/support_bundle (diff)
downloadfrr-54baf432f064f30e22b2c5873a54ac6f407131ce.tar.xz
frr-54baf432f064f30e22b2c5873a54ac6f407131ce.zip
lib: delete pthread from tracking list on delete
Pthreads were not being deleted from the list after destruction. This isn't causing any bugs currently but that's just by dumb luck. Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to '')
-rw-r--r--lib/frr_pthread.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/frr_pthread.c b/lib/frr_pthread.c
index 21dfc9256..97550eae5 100644
--- a/lib/frr_pthread.c
+++ b/lib/frr_pthread.c
@@ -51,12 +51,13 @@ void frr_pthread_init(void)
{
frr_with_mutex(&frr_pthread_list_mtx) {
frr_pthread_list = list_new();
- frr_pthread_list->del = (void (*)(void *))&frr_pthread_destroy;
}
}
void frr_pthread_finish(void)
{
+ frr_pthread_stop_all();
+
frr_with_mutex(&frr_pthread_list_mtx) {
list_delete(&frr_pthread_list);
}
@@ -99,8 +100,11 @@ struct frr_pthread *frr_pthread_new(struct frr_pthread_attr *attr,
void frr_pthread_destroy(struct frr_pthread *fpt)
{
- thread_master_free(fpt->master);
+ frr_with_mutex(&frr_pthread_list_mtx) {
+ listnode_delete(frr_pthread_list, fpt);
+ }
+ thread_master_free(fpt->master);
pthread_mutex_destroy(&fpt->mtx);
pthread_mutex_destroy(fpt->running_cond_mtx);
pthread_cond_destroy(fpt->running_cond);
@@ -183,8 +187,11 @@ void frr_pthread_stop_all(void)
frr_with_mutex(&frr_pthread_list_mtx) {
struct listnode *n;
struct frr_pthread *fpt;
- for (ALL_LIST_ELEMENTS_RO(frr_pthread_list, n, fpt))
- frr_pthread_stop(fpt, NULL);
+ for (ALL_LIST_ELEMENTS_RO(frr_pthread_list, n, fpt)) {
+ if (atomic_load_explicit(&fpt->running,
+ memory_order_relaxed))
+ frr_pthread_stop(fpt, NULL);
+ }
}
}