]> granicus.if.org Git - php/commitdiff
improved timeout handling on windows
authorDmitry Stogov <dmitry@zend.com>
Mon, 16 Mar 2015 16:48:29 +0000 (17:48 +0100)
committerAnatol Belski <ab@php.net>
Mon, 16 Mar 2015 16:49:43 +0000 (17:49 +0100)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
Zend/zend_vm_execute.skl

index 2f93f2879191b660961672422c686c2ca4a91f12..b24218a2b2250e6cfa1c5f69a45cc58ac96ca521 100644 (file)
@@ -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))
 
index d7cf7ad9c863c0d01cecb8f2536ef4432580f422..c6fff781588744f8b791a04d15b15d0990128497 100644 (file)
@@ -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... */
index 46da517a62217d6ce3d7c76087875048c734c1b5..a9ad8deec4f119ff8b5401d91e725ac87f1f1687 100644 (file)
@@ -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();
 }
 
index e5df1c8ba14347d6213fd4009c3b10f563770a61..aba4d2c4f035ca0549cf8df69e75e0a63a3cae24 100644 (file)
@@ -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%}
                }