summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-03-16 17:48:29 +0100
committerAnatol Belski <ab@php.net>2015-03-16 17:49:43 +0100
commit5c68836b0b6e205a4f3008934c550b0e80463d66 (patch)
tree9e16904706d74e1519bb0d10f3f3de1a832374ad /Zend
parent4d3a3811a955827ca4163c79562705324886a8e2 (diff)
downloadphp-git-5c68836b0b6e205a4f3008934c550b0e80463d66.tar.gz
improved timeout handling on windows
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_execute.c21
-rw-r--r--Zend/zend_vm_def.h13
-rw-r--r--Zend/zend_vm_execute.h37
-rw-r--r--Zend/zend_vm_execute.skl6
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%}
}