diff --git a/src/debug.c b/src/debug.c index 785ad4e41..32e0c373c 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1583,6 +1583,7 @@ static void killMainThread(void) { static void killThreads(void) { killMainThread(); bioKillThreads(); + killIOThreads(); } void doFastMemoryTest(void) { diff --git a/src/networking.c b/src/networking.c index 8090e391d..6becdc288 100644 --- a/src/networking.c +++ b/src/networking.c @@ -3028,6 +3028,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 d4d8de95a..ae2cecf31 100644 --- a/src/server.h +++ b/src/server.h @@ -2478,6 +2478,7 @@ 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 debugDelay(int usec); +void killIOThreads(void); /* TLS stuff */ void tlsInit(void);