diff options
author | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-08-09 20:01:06 +0200 |
---|---|---|
committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-09-16 18:12:00 +0200 |
commit | 54baf432f064f30e22b2c5873a54ac6f407131ce (patch) | |
tree | e447c45fbcae24b74dee539efc0f77b679cc277c /lib/frr_pthread.c | |
parent | Merge pull request #4834 from srimohans/support_bundle (diff) | |
download | frr-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.c | 15 |
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); + } } } |