Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
0d5f4ba7
Commit
0d5f4ba7
authored
Apr 05, 2012
by
Salvatore Sanfilippo
Browse files
Merge pull request #431 from anydot/f-signal
allocate alternate signal stack, change of sigaction flags for sigterm
parents
ebba7b3c
c5757662
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/redis.c
View file @
0d5f4ba7
...
@@ -62,6 +62,9 @@ double R_Zero, R_PosInf, R_NegInf, R_Nan;
...
@@ -62,6 +62,9 @@ double R_Zero, R_PosInf, R_NegInf, R_Nan;
/*================================= Globals ================================= */
/*================================= Globals ================================= */
/* Alternate stack for SIGSEGV/etc handlers */
char
altstack
[
SIGSTKSZ
];
/* Global vars */
/* Global vars */
struct
redisServer
server
;
/* server global state */
struct
redisServer
server
;
/* server global state */
struct
redisCommand
*
commandTable
;
struct
redisCommand
*
commandTable
;
...
@@ -2329,15 +2332,24 @@ static void sigtermHandler(int sig) {
...
@@ -2329,15 +2332,24 @@ static void sigtermHandler(int sig) {
void
setupSignalHandlers
(
void
)
{
void
setupSignalHandlers
(
void
)
{
struct
sigaction
act
;
struct
sigaction
act
;
stack_t
stack
;
stack
.
ss_sp
=
altstack
;
stack
.
ss_flags
=
0
;
stack
.
ss_size
=
SIGSTKSZ
;
sigaltstack
(
&
stack
,
NULL
);
/* 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 is used.
* Otherwise, sa_handler is used. */
* Otherwise, sa_handler is used. */
sigemptyset
(
&
act
.
sa_mask
);
sigemptyset
(
&
act
.
sa_mask
);
act
.
sa_flags
=
SA_NODEFER
|
SA_ONSTACK
|
SA_RESETHAND
;
act
.
sa_flags
=
0
;
act
.
sa_handler
=
sigtermHandler
;
act
.
sa_handler
=
sigtermHandler
;
sigaction
(
SIGTERM
,
&
act
,
NULL
);
sigaction
(
SIGTERM
,
&
act
,
NULL
);
#ifdef HAVE_BACKTRACE
#ifdef HAVE_BACKTRACE
/* Use alternate stack so we don't clobber stack in case of segv, or when we run out of stack ..
* also resethand & nodefer so we can get interrupted (and killed) if we cause SEGV during SEGV handler */
sigemptyset
(
&
act
.
sa_mask
);
sigemptyset
(
&
act
.
sa_mask
);
act
.
sa_flags
=
SA_NODEFER
|
SA_ONSTACK
|
SA_RESETHAND
|
SA_SIGINFO
;
act
.
sa_flags
=
SA_NODEFER
|
SA_ONSTACK
|
SA_RESETHAND
|
SA_SIGINFO
;
act
.
sa_sigaction
=
sigsegvHandler
;
act
.
sa_sigaction
=
sigsegvHandler
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment