diff --git a/src/bio.c b/src/bio.c index 33465a166..ff1108799 100644 --- a/src/bio.c +++ b/src/bio.c @@ -168,10 +168,7 @@ void *bioProcessBackgroundJobs(void *arg) { redisSetCpuAffinity(server.bio_cpulist); - /* Make the thread killable at any time, so that bioKillThreads() - * can work reliably. */ - pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); - pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + makeThreadKillable(); pthread_mutex_lock(&bio_mutex[type]); /* Block SIGALRM so we are sure that only the main thread will diff --git a/src/server.c b/src/server.c index ed416fb4c..5face48bb 100644 --- a/src/server.c +++ b/src/server.c @@ -2798,12 +2798,21 @@ void resetServerStats(void) { server.aof_delayed_fsync = 0; } +/* Make the thread killable at any time, so that kill threads functions + * can work reliably (default cancelability type is PTHREAD_CANCEL_DEFERRED). + * Needed for pthread_cancel used by the fast memory test used by the crash report. */ +void makeThreadKillable(void) { + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +} + void initServer(void) { int j; signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); setupSignalHandlers(); + makeThreadKillable(); if (server.syslog_enabled) { openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT, diff --git a/src/server.h b/src/server.h index 66d373944..3317092a0 100644 --- a/src/server.h +++ b/src/server.h @@ -2471,6 +2471,7 @@ void xorDigest(unsigned char *digest, void *ptr, size_t len); int populateCommandTableParseFlags(struct redisCommand *c, char *strflags); void killIOThreads(void); void killThreads(void); +void makeThreadKillable(void); /* TLS stuff */ void tlsInit(void);