diff --git a/src/debug.c b/src/debug.c index 178893bae..ae62c0216 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1530,6 +1530,7 @@ static void killMainThread(void) { static void killThreads(void) { killMainThread(); bioKillThreads(); + killIOThreads(); } /* Scans the (assumed) x86 code starting at addr, for a max of `len` diff --git a/src/networking.c b/src/networking.c index 0d290e169..b7d6d6211 100644 --- a/src/networking.c +++ b/src/networking.c @@ -3021,6 +3021,23 @@ void initThreadedIO(void) { } } +void killIOThreads(void) { + int err, j; + for (j = 0; j < server.io_threads_num; j++) { + if (io_threads[j] == pthread_self()) continue; + if (io_threads[j] && pthread_cancel(io_threads[j]) == 0) { + if ((err = pthread_join(io_threads[j],NULL)) != 0) { + serverLog(LL_WARNING, + "IO thread(tid:%lu) can not be joined: %s", + (unsigned long)io_threads[j], strerror(err)); + } else { + serverLog(LL_WARNING, + "IO thread(tid:%lu) terminated",(unsigned long)io_threads[j]); + } + } + } +} + void startThreadedIO(void) { if (tio_debug) { printf("S"); fflush(stdout); } if (tio_debug) printf("--- STARTING THREADED IO ---\n"); diff --git a/src/server.h b/src/server.h index a1ce26cc2..8cf29820d 100644 --- a/src/server.h +++ b/src/server.h @@ -2460,6 +2460,7 @@ int memtest_preserving_test(unsigned long *m, size_t bytes, int passes); void mixDigest(unsigned char *digest, void *ptr, size_t len); void xorDigest(unsigned char *digest, void *ptr, size_t len); int populateCommandTableParseFlags(struct redisCommand *c, char *strflags); +void killIOThreads(void); /* TLS stuff */ void tlsInit(void);