diff --git a/hw/hns3/hns3_udma_u_jetty.c b/hw/hns3/hns3_udma_u_jetty.c index 1e363a49c2c2455d8bd6d3d6e92f5a34c18bedb6..617b09264eccb6890a031bf2192468a53318f2df 100644 --- a/hw/hns3/hns3_udma_u_jetty.c +++ b/hw/hns3/hns3_udma_u_jetty.c @@ -197,13 +197,15 @@ static void udma_free_tjetty_tbl(struct udma_u_jetty *udma_jetty) struct tgt_node *cur, *next; if (udma_jetty->tjetty_tbl) { - (void)pthread_rwlock_rdlock(&udma_jetty->tjetty_tbl->rwlock); + + (void)pthread_rwlock_wrlock(&udma_jetty->tjetty_tbl->rwlock);// 升级为写锁 HMAP_FOR_EACH_SAFE(cur, next, hmap_node, &udma_jetty->tjetty_tbl->hmap) { - (void)pthread_rwlock_unlock(&udma_jetty->tjetty_tbl->rwlock); udma_u_unadvise_jetty(&udma_jetty->urma_jetty, cur->tjetty, false); - (void)pthread_rwlock_rdlock(&udma_jetty->tjetty_tbl->rwlock); + HMAP_REMOVE(hmap_node, &udma_jetty->tjetty_tbl->hmap, cur); + free(cur); // 释放节点内存 } (void)pthread_rwlock_unlock(&udma_jetty->tjetty_tbl->rwlock); + pthread_rwlock_destroy(&udma_jetty->tjetty_tbl->rwlock); // 销毁读写锁 udma_hmap_destroy(&udma_jetty->tjetty_tbl->hmap); free(udma_jetty->tjetty_tbl); udma_jetty->tjetty_tbl = NULL;