mirror of
https://github.com/fluencelabs/redis
synced 2025-04-01 15:21:03 +00:00
Merge remote branch 'pietern/unstable-sigs' into unstable
This commit is contained in:
commit
c2f816b423
46
src/redis.c
46
src/redis.c
@ -859,7 +859,7 @@ void initServer() {
|
|||||||
|
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
setupSigSegvAction();
|
setupSignalHandlers();
|
||||||
|
|
||||||
if (server.syslog_enabled) {
|
if (server.syslog_enabled) {
|
||||||
openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
|
openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
|
||||||
@ -1705,10 +1705,8 @@ int main(int argc, char **argv) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ============================= Backtrace support ========================= */
|
|
||||||
|
|
||||||
#ifdef HAVE_BACKTRACE
|
#ifdef HAVE_BACKTRACE
|
||||||
void *getMcontextEip(ucontext_t *uc) {
|
static void *getMcontextEip(ucontext_t *uc) {
|
||||||
#if defined(__FreeBSD__)
|
#if defined(__FreeBSD__)
|
||||||
return (void*) uc->uc_mcontext.mc_eip;
|
return (void*) uc->uc_mcontext.mc_eip;
|
||||||
#elif defined(__dietlibc__)
|
#elif defined(__dietlibc__)
|
||||||
@ -1736,7 +1734,7 @@ void *getMcontextEip(ucontext_t *uc) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void segvHandler(int sig, siginfo_t *info, void *secret) {
|
static void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
|
||||||
void *trace[100];
|
void *trace[100];
|
||||||
char **messages = NULL;
|
char **messages = NULL;
|
||||||
int i, trace_size = 0;
|
int i, trace_size = 0;
|
||||||
@ -1775,37 +1773,35 @@ void segvHandler(int sig, siginfo_t *info, void *secret) {
|
|||||||
sigaction (sig, &act, NULL);
|
sigaction (sig, &act, NULL);
|
||||||
kill(getpid(),sig);
|
kill(getpid(),sig);
|
||||||
}
|
}
|
||||||
|
#endif /* HAVE_BACKTRACE */
|
||||||
|
|
||||||
void sigtermHandler(int sig) {
|
static void sigtermHandler(int sig) {
|
||||||
REDIS_NOTUSED(sig);
|
REDIS_NOTUSED(sig);
|
||||||
|
|
||||||
redisLog(REDIS_WARNING,"SIGTERM received, scheduling shutting down...");
|
redisLog(REDIS_WARNING,"Received SIGTERM, scheduling shutdown...");
|
||||||
server.shutdown_asap = 1;
|
server.shutdown_asap = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupSigSegvAction(void) {
|
void setupSignalHandlers(void) {
|
||||||
struct sigaction act;
|
struct sigaction act;
|
||||||
|
|
||||||
sigemptyset (&act.sa_mask);
|
/* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used.
|
||||||
/* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction
|
* Otherwise, sa_handler is used. */
|
||||||
* is used. Otherwise, sa_handler is used */
|
sigemptyset(&act.sa_mask);
|
||||||
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
|
|
||||||
act.sa_sigaction = segvHandler;
|
|
||||||
sigaction (SIGSEGV, &act, NULL);
|
|
||||||
sigaction (SIGBUS, &act, NULL);
|
|
||||||
sigaction (SIGFPE, &act, NULL);
|
|
||||||
sigaction (SIGILL, &act, NULL);
|
|
||||||
sigaction (SIGBUS, &act, NULL);
|
|
||||||
|
|
||||||
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
|
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
|
||||||
act.sa_handler = sigtermHandler;
|
act.sa_handler = sigtermHandler;
|
||||||
sigaction (SIGTERM, &act, NULL);
|
sigaction(SIGTERM, &act, NULL);
|
||||||
|
|
||||||
|
#ifdef HAVE_BACKTRACE
|
||||||
|
sigemptyset(&act.sa_mask);
|
||||||
|
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
|
||||||
|
act.sa_sigaction = sigsegvHandler;
|
||||||
|
sigaction(SIGSEGV, &act, NULL);
|
||||||
|
sigaction(SIGBUS, &act, NULL);
|
||||||
|
sigaction(SIGFPE, &act, NULL);
|
||||||
|
sigaction(SIGILL, &act, NULL);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* HAVE_BACKTRACE */
|
|
||||||
void setupSigSegvAction(void) {
|
|
||||||
}
|
|
||||||
#endif /* HAVE_BACKTRACE */
|
|
||||||
|
|
||||||
/* The End */
|
/* The End */
|
||||||
|
@ -796,7 +796,7 @@ zskiplistNode *zslInsert(zskiplist *zsl, double score, robj *obj);
|
|||||||
/* Core functions */
|
/* Core functions */
|
||||||
void freeMemoryIfNeeded(void);
|
void freeMemoryIfNeeded(void);
|
||||||
int processCommand(redisClient *c);
|
int processCommand(redisClient *c);
|
||||||
void setupSigSegvAction(void);
|
void setupSignalHandlers(void);
|
||||||
struct redisCommand *lookupCommand(sds name);
|
struct redisCommand *lookupCommand(sds name);
|
||||||
struct redisCommand *lookupCommandByCString(char *s);
|
struct redisCommand *lookupCommandByCString(char *s);
|
||||||
void call(redisClient *c, struct redisCommand *cmd);
|
void call(redisClient *c, struct redisCommand *cmd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user