From e217738f700e61c91167c671d750a35bbe4e9375 Mon Sep 17 00:00:00 2001 From: Jeff Tao Date: Tue, 31 Mar 2020 18:49:29 +0800 Subject: [PATCH] fix the remove queue from queue set bug --- src/util/src/tqueue.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/util/src/tqueue.c b/src/util/src/tqueue.c index 1ac05556d6..d667b2428f 100644 --- a/src/util/src/tqueue.c +++ b/src/util/src/tqueue.c @@ -68,10 +68,10 @@ void taosCloseQueue(taos_queue param) { STaosQnode *pNode = queue->head; queue->head = NULL; - pthread_mutex_lock(&queue->mutex); - if (queue->qset) taosRemoveFromQset(queue->qset, queue); + pthread_mutex_lock(&queue->mutex); + while (pNode) { pTemp = pNode; pNode = pNode->next; @@ -253,33 +253,37 @@ void taosRemoveFromQset(taos_qset p1, taos_queue p2) { STaosQueue *queue = (STaosQueue *)p2; STaosQset *qset = (STaosQset *)p1; - STaosQueue *tqueue; + STaosQueue *tqueue = NULL; pthread_mutex_lock(&qset->mutex); if (qset->head) { if (qset->head == queue) { qset->head = qset->head->next; - qset->numOfQueues--; + tqueue = queue; } else { STaosQueue *prev = qset->head; tqueue = qset->head->next; while (tqueue) { if (tqueue== queue) { prev->next = tqueue->next; - if (qset->current == queue) qset->current = tqueue->next; - qset->numOfQueues--; - - pthread_mutex_lock(&queue->mutex); - atomic_sub_fetch_32(&qset->numOfItems, queue->numOfItems); - queue->qset = NULL; - pthread_mutex_unlock(&queue->mutex); + break; } else { prev = tqueue; tqueue = tqueue->next; } } } + + if (tqueue) { + if (qset->current == queue) qset->current = tqueue->next; + qset->numOfQueues--; + + pthread_mutex_lock(&queue->mutex); + atomic_sub_fetch_32(&qset->numOfItems, queue->numOfItems); + queue->qset = NULL; + pthread_mutex_lock(&queue->mutex); + } } pthread_mutex_unlock(&qset->mutex); -- GitLab