From 83f70811761c3765736af80cf4fd8c7b1d8f1641 Mon Sep 17 00:00:00 2001 From: afwerar <1296468573@qq.com> Date: Sun, 5 Sep 2021 12:14:18 +0800 Subject: [PATCH] [TD-6169]: windows dll client can not quit. --- src/util/src/tcache.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/util/src/tcache.c b/src/util/src/tcache.c index 69b3741e13..3ab100acab 100644 --- a/src/util/src/tcache.c +++ b/src/util/src/tcache.c @@ -71,6 +71,7 @@ static pthread_once_t cacheThreadInit = PTHREAD_ONCE_INIT; static pthread_mutex_t guard = PTHREAD_MUTEX_INITIALIZER; static SArray* pCacheArrayList = NULL; static bool stopRefreshWorker = false; +static bool refreshWorkerStopped = false; static void doInitRefreshThread(void) { pCacheArrayList = taosArrayInit(4, POINTER_BYTES); @@ -538,6 +539,8 @@ void taosCacheCleanup(SCacheObj *pCacheObj) { // wait for the refresh thread quit before destroying the cache object. while(atomic_load_8(&pCacheObj->deleting) != 0) { + if (refreshWorkerUnexpectedStopped) return; + if (refreshWorkerNormalStopped) break; taosMsleep(50); } @@ -676,6 +679,12 @@ static void doCacheRefresh(SCacheObj* pCacheObj, int64_t time, __cache_free_fn_t taosHashCondTraverse(pCacheObj->pHashTable, travHashTableFn, &sup); } +void taosCacheRefreshWorkerUnexpectedStopped(void) { + if(!refreshWorkerNormalStopped) { + refreshWorkerUnexpectedStopped=true; + } +} + void* taosCacheTimedRefresh(void *handle) { assert(pCacheArrayList != NULL); uDebug("cache refresh thread starts"); @@ -685,6 +694,8 @@ void* taosCacheTimedRefresh(void *handle) { const int32_t SLEEP_DURATION = 500; //500 ms int64_t count = 0; + atexit(taosCacheRefreshWorkerUnexpectedStopped); + while(1) { taosMsleep(SLEEP_DURATION); if (stopRefreshWorker) { @@ -748,6 +759,7 @@ void* taosCacheTimedRefresh(void *handle) { pCacheArrayList = NULL; pthread_mutex_destroy(&guard); + refreshWorkerNormalStopped=true; uDebug("cache refresh thread quits"); return NULL; -- GitLab