mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Use sigsetjmp and siglongjmp instead of setjmp/longjmp in order to be
consistent in how we deal with the signal mask. POSIX doesn't specify what to do with the signal mask in setjmp/longjmp which has resulted in the signal mask getting saved on *BSD and not getting saved on Linux. Making the behaviour explicit via sigsetjmp/siglongjmp gives us consistency and saves expensive sigprocmask() syscalls on *BSD.
This commit is contained in:
parent
4d9cbaf7a4
commit
c9e0781d2a
@ -794,7 +794,7 @@ ZEND_API void _zend_bailout(char *filename, uint lineno) /* {{{ */
|
||||
CG(unclean_shutdown) = 1;
|
||||
CG(in_compilation) = EG(in_execution) = 0;
|
||||
EG(current_execute_data) = NULL;
|
||||
longjmp(*EG(bailout), FAILURE);
|
||||
siglongjmp(*EG(bailout), FAILURE);
|
||||
}
|
||||
/* }}} */
|
||||
END_EXTERN_C()
|
||||
|
@ -522,11 +522,11 @@ END_EXTERN_C()
|
||||
|
||||
#define zend_try \
|
||||
{ \
|
||||
jmp_buf *__orig_bailout = EG(bailout); \
|
||||
jmp_buf __bailout; \
|
||||
sigjmp_buf *__orig_bailout = EG(bailout); \
|
||||
sigjmp_buf __bailout; \
|
||||
\
|
||||
EG(bailout) = &__bailout; \
|
||||
if (setjmp(__bailout)==0) {
|
||||
if (sigsetjmp(__bailout, 0)==0) {
|
||||
#define zend_catch \
|
||||
} else { \
|
||||
EG(bailout) = __orig_bailout;
|
||||
|
@ -161,7 +161,7 @@ struct _zend_executor_globals {
|
||||
|
||||
HashTable included_files; /* files already included */
|
||||
|
||||
jmp_buf *bailout;
|
||||
sigjmp_buf *bailout;
|
||||
|
||||
int error_reporting;
|
||||
int orig_error_reporting;
|
||||
|
Loading…
Reference in New Issue
Block a user