]> git.proxmox.com Git - mirror_frr.git/commitdiff
lib: delete pthread from tracking list on delete
authorQuentin Young <qlyoung@cumulusnetworks.com>
Fri, 9 Aug 2019 18:01:06 +0000 (18:01 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Mon, 16 Sep 2019 16:12:00 +0000 (16:12 +0000)
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>
lib/frr_pthread.c

index 21dfc9256ff9fd7708062b51d4f0c3af829166b1..97550eae533d79827335d86489d7b9137ef31ccb 100644 (file)
@@ -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);
+               }
        }
 }