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:
Rasmus Lerdorf 2008-03-18 18:34:11 +00:00
parent 4d9cbaf7a4
commit c9e0781d2a
3 changed files with 5 additions and 5 deletions

View File

@ -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()

View File

@ -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;

View File

@ -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;