diff --git a/src/os/linux/src/tlinux.c b/src/os/linux/src/tlinux.c index b819514be7299b73158b3ff7e9dbc07f4109ea76..c1bd0ceb5f5059f09bec9023dc1c767fbc871b9e 100644 --- a/src/os/linux/src/tlinux.c +++ b/src/os/linux/src/tlinux.c @@ -227,6 +227,11 @@ int taosOpenUDServerSocket(char *ip, uint16_t port) { return sockFd; } +static void taosDeleteTimer(void *tharg) { + timer_t *pTimer = tharg; + timer_delete(*pTimer); +} + void *taosProcessAlarmSignal(void *tharg) { // Block the signal sigset_t sigset; @@ -235,7 +240,7 @@ void *taosProcessAlarmSignal(void *tharg) { sigprocmask(SIG_BLOCK, &sigset, NULL); void (*callback)(int) = tharg; - timer_t timerId; + static timer_t timerId; struct sigevent sevent = {0}; #ifdef _ALPINE @@ -252,6 +257,8 @@ void *taosProcessAlarmSignal(void *tharg) { tmrError("Failed to create timer"); } + pthread_cleanup_push(taosDeleteTimer, &timerId); + struct itimerspec ts; ts.it_value.tv_sec = 0; ts.it_value.tv_nsec = 1000000 * MSECONDS_PER_TICK; @@ -273,6 +280,8 @@ void *taosProcessAlarmSignal(void *tharg) { callback(0); } + + pthread_cleanup_pop(1); return NULL; } @@ -282,13 +291,15 @@ int taosInitTimer(void (*callback)(int), int ms) { pthread_attr_t tattr; pthread_attr_init(&tattr); pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); - if (pthread_create(&thread, &tattr, taosProcessAlarmSignal, callback) != 0) { + int code = pthread_create(&thread, &tattr, taosProcessAlarmSignal, callback); + pthread_detach(thread); + pthread_attr_destroy(&tattr); + if (code != 0) { tmrError("failed to create timer thread"); return -1; } - pthread_attr_destroy(&tattr); - return 0; + return thread; } ssize_t tread(int fd, void *buf, size_t count) { diff --git a/src/rpc/src/rpcMain.c b/src/rpc/src/rpcMain.c index 75b23950edba5b99d8c1f2d8485c80124fc1bfee..a51d9ee4b54fa972ef75b96bc84df433e9bb0071 100644 --- a/src/rpc/src/rpcMain.c +++ b/src/rpc/src/rpcMain.c @@ -302,6 +302,7 @@ void rpcClose(void *param) { tfree(pRpc->connList); pthread_mutex_destroy(&pRpc->mutex); + tTrace("%s RPC is closed", pRpc->label); tfree(pRpc); } diff --git a/src/util/src/ttimer.c b/src/util/src/ttimer.c index ccac1de518af34c30cca8df05c8fca9f781bdd4e..db06e1531b378e3cdfb2bdfdccfad6bd4b91a8ee 100644 --- a/src/util/src/ttimer.c +++ b/src/util/src/ttimer.c @@ -84,6 +84,8 @@ static tmr_ctrl_t* tmrCtrls; static tmr_ctrl_t* unusedTmrCtrl = NULL; static void* tmrQhandle; static int numOfTmrCtrl = 0; +//static void* tmrContext = NULL; +static int athread = 0; int taosTmrThreads = 1; @@ -517,7 +519,7 @@ static void taosTmrModuleInit(void) { } tmrQhandle = taosInitScheduler(10000, taosTmrThreads, "tmr"); - taosInitTimer(taosTimerLoopFunc, MSECONDS_PER_TICK); + athread = taosInitTimer(taosTimerLoopFunc, MSECONDS_PER_TICK); tmrTrace("timer module is initialized, number of threads: %d", taosTmrThreads); } @@ -558,4 +560,22 @@ void taosTmrCleanUp(void* handle) { numOfTmrCtrl--; unusedTmrCtrl = ctrl; pthread_mutex_unlock(&tmrCtrlMutex); + + if (numOfTmrCtrl <=0) { + pthread_cancel(athread); + + for (int i = 0; i < tListLen(wheels); i++) { + time_wheel_t* wheel = wheels + i; + pthread_mutex_destroy(&wheel->mutex); + free(wheel->slots); + } + + pthread_mutex_destroy(&tmrCtrlMutex); + free(timerMap.slots); + free(tmrCtrls); + taosCleanUpScheduler(tmrQhandle); + tmrModuleInit = PTHREAD_ONCE_INIT; + + tmrTrace("timer module is cleaned up"); + } }