diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2015-03-16 17:48:29 +0100 |
|---|---|---|
| committer | Anatol Belski <ab@php.net> | 2015-03-16 17:49:43 +0100 |
| commit | 5c68836b0b6e205a4f3008934c550b0e80463d66 (patch) | |
| tree | 9e16904706d74e1519bb0d10f3f3de1a832374ad /Zend | |
| parent | 4d3a3811a955827ca4163c79562705324886a8e2 (diff) | |
| download | php-git-5c68836b0b6e205a4f3008934c550b0e80463d66.tar.gz | |
improved timeout handling on windows
Diffstat (limited to 'Zend')
| -rw-r--r-- | Zend/zend_execute.c | 21 | ||||
| -rw-r--r-- | Zend/zend_vm_def.h | 13 | ||||
| -rw-r--r-- | Zend/zend_vm_execute.h | 37 | ||||
| -rw-r--r-- | Zend/zend_vm_execute.skl | 6 |
4 files changed, 48 insertions, 29 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 2f93f28791..b24218a2b2 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1727,6 +1727,17 @@ void zend_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */ } /* }}} */ +#ifdef ZEND_WIN32 +# define ZEND_VM_INTERRUPT_CHECK() do { \ + if (EG(timed_out)) { \ + zend_timeout(0); \ + } \ + } while (0) +#else +# define ZEND_VM_INTERRUPT_CHECK() do { \ + } while (0) +#endif + /* * Stack Frame Layout (the whole stack frame is allocated at once) * ================== @@ -1816,6 +1827,7 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu EX_LOAD_LITERALS(op_array); EG(current_execute_data) = execute_data; + ZEND_VM_INTERRUPT_CHECK(); } /* }}} */ @@ -1842,6 +1854,7 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu EX_LOAD_LITERALS(op_array); EG(current_execute_data) = execute_data; + ZEND_VM_INTERRUPT_CHECK(); } /* }}} */ @@ -1923,6 +1936,7 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da EX_LOAD_LITERALS(op_array); EG(current_execute_data) = execute_data; + ZEND_VM_INTERRUPT_CHECK(); } /* }}} */ @@ -2050,10 +2064,15 @@ static zend_always_inline void zend_vm_stack_extend_call_frame(zend_execute_data ZEND_VM_INC_OPCODE(); \ ZEND_VM_CONTINUE() -#define ZEND_VM_SET_OPCODE(new_op) \ +#define ZEND_VM_SET_NEXT_OPCODE(new_op) \ CHECK_SYMBOL_TABLES() \ OPLINE = new_op +#define ZEND_VM_SET_OPCODE(new_op) \ + CHECK_SYMBOL_TABLES() \ + OPLINE = new_op; \ + ZEND_VM_INTERRUPT_CHECK() + #define ZEND_VM_SET_RELATIVE_OPCODE(opline, offset) \ ZEND_VM_SET_OPCODE(ZEND_OFFSET_TO_OPLINE(opline, offset)) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d7cf7ad9c8..c6fff78158 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2097,7 +2097,7 @@ ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, ANY) val = GET_OP1_ZVAL_PTR(BP_VAR_R); if (Z_TYPE_P(val) == IS_TRUE) { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) { if (OP1_TYPE == IS_CV) { @@ -2136,7 +2136,7 @@ ZEND_VM_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, ANY) if (OP1_TYPE == IS_CV) { ZEND_VM_NEXT_OPCODE(); } else { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } } @@ -2198,7 +2198,7 @@ ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, ANY) if (Z_TYPE_P(val) == IS_TRUE) { ZVAL_TRUE(EX_VAR(opline->result.var)); - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) { ZVAL_FALSE(EX_VAR(opline->result.var)); @@ -2244,7 +2244,7 @@ ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, ANY) if (OP1_TYPE == IS_CV) { ZEND_VM_NEXT_OPCODE(); } else { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } } @@ -2967,6 +2967,7 @@ ZEND_VM_HANDLER(129, ZEND_DO_ICALL, ANY, ANY) HANDLE_EXCEPTION(); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } @@ -3094,6 +3095,7 @@ ZEND_VM_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY) } HANDLE_EXCEPTION(); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } @@ -3295,6 +3297,7 @@ ZEND_VM_C_LABEL(fcall_end): HANDLE_EXCEPTION(); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } @@ -4807,6 +4810,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY) } else if (RETURN_VALUE_USED(opline)) { ZVAL_BOOL(EX_VAR(opline->result.var), failure_retval); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } @@ -6274,6 +6278,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0; int in_finally = 0; + ZEND_VM_INTERRUPT_CHECK(); for (i = 0; i < EX(func)->op_array.last_try_catch; i++) { if (EX(func)->op_array.try_catch_array[i].try_op > op_num) { /* further blocks will not be relevant... */ diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 46da517a62..a9ad8deec4 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -391,12 +391,6 @@ ZEND_API void execute_ex(zend_execute_data *ex) while (1) { int ret; -#ifdef ZEND_WIN32 - if (EG(timed_out)) { - zend_timeout(0); - } -#endif - if (UNEXPECTED((ret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) != 0)) { #ifdef ZEND_VM_FP_GLOBAL_REG execute_data = orig_execute_data; @@ -587,6 +581,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_HANDLER(ZEND_OPC HANDLE_EXCEPTION(); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } @@ -714,6 +709,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER( } HANDLE_EXCEPTION(); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } @@ -915,6 +911,7 @@ fcall_end: HANDLE_EXCEPTION(); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } @@ -1463,6 +1460,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER( uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0; int in_finally = 0; + ZEND_VM_INTERRUPT_CHECK(); for (i = 0; i < EX(func)->op_array.last_try_catch; i++) { if (EX(func)->op_array.try_catch_array[i].try_op > op_num) { /* further blocks will not be relevant... */ @@ -2637,7 +2635,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_O val = EX_CONSTANT(opline->op1); if (Z_TYPE_P(val) == IS_TRUE) { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) { if (IS_CONST == IS_CV) { @@ -2676,7 +2674,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_ if (IS_CONST == IS_CV) { ZEND_VM_NEXT_OPCODE(); } else { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } } @@ -2738,7 +2736,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEN if (Z_TYPE_P(val) == IS_TRUE) { ZVAL_TRUE(EX_VAR(opline->result.var)); - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) { ZVAL_FALSE(EX_VAR(opline->result.var)); @@ -2784,7 +2782,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZE if (IS_CONST == IS_CV) { ZEND_VM_NEXT_OPCODE(); } else { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } } @@ -3360,6 +3358,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN } else if (RETURN_VALUE_USED(opline)) { ZVAL_BOOL(EX_VAR(opline->result.var), failure_retval); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } @@ -24894,7 +24893,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CV_HANDLER(ZEND_OPCO val = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var); if (Z_TYPE_P(val) == IS_TRUE) { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) { if (IS_CV == IS_CV) { @@ -24933,7 +24932,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPC if (IS_CV == IS_CV) { ZEND_VM_NEXT_OPCODE(); } else { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } } @@ -24995,7 +24994,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_O if (Z_TYPE_P(val) == IS_TRUE) { ZVAL_TRUE(EX_VAR(opline->result.var)); - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) { ZVAL_FALSE(EX_VAR(opline->result.var)); @@ -25041,7 +25040,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CV_HANDLER(ZEND_ if (IS_CV == IS_CV) { ZEND_VM_NEXT_OPCODE(); } else { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } } @@ -25705,6 +25704,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE } else if (RETURN_VALUE_USED(opline)) { ZVAL_BOOL(EX_VAR(opline->result.var), failure_retval); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } @@ -34948,7 +34948,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_TMPVAR_HANDLER(ZEND_ val = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); if (Z_TYPE_P(val) == IS_TRUE) { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) { if ((IS_TMP_VAR|IS_VAR) == IS_CV) { @@ -34987,7 +34987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND if ((IS_TMP_VAR|IS_VAR) == IS_CV) { ZEND_VM_NEXT_OPCODE(); } else { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } } @@ -35049,7 +35049,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZE if (Z_TYPE_P(val) == IS_TRUE) { ZVAL_TRUE(EX_VAR(opline->result.var)); - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) { ZVAL_FALSE(EX_VAR(opline->result.var)); @@ -35095,7 +35095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER(Z if ((IS_TMP_VAR|IS_VAR) == IS_CV) { ZEND_VM_NEXT_OPCODE(); } else { - ZEND_VM_SET_OPCODE(opline + 1); + ZEND_VM_SET_NEXT_OPCODE(opline + 1); ZEND_VM_CONTINUE(); } } @@ -35354,6 +35354,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA } else if (RETURN_VALUE_USED(opline)) { ZVAL_BOOL(EX_VAR(opline->result.var), failure_retval); } + ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_NEXT_OPCODE(); } diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl index e5df1c8ba1..aba4d2c4f0 100644 --- a/Zend/zend_vm_execute.skl +++ b/Zend/zend_vm_execute.skl @@ -12,12 +12,6 @@ ZEND_API void {%EXECUTOR_NAME%}_ex(zend_execute_data *ex) while (1) { {%ZEND_VM_CONTINUE_LABEL%} -#ifdef ZEND_WIN32 - if (EG(timed_out)) { - zend_timeout(0); - } -#endif - {%ZEND_VM_DISPATCH%} { {%INTERNAL_EXECUTOR%} } |
