ID:               16820
 Updated by:       j...@php.net
-Summary:          hangs in multithreaded environment (ZTS)
 Reported By:      wmeler at wp-sa dot pl
-Status:           Open
+Status:           Assigned
 Bug Type:         Scripting Engine problem
 Operating System: * (ZTS only)
 PHP Version:      5.*, 6, 7, 8..
-Assigned To:      
+Assigned To:      dmitry
 New Comment:

Dmitry, now there's patch to fix this.


Previous Comments:
------------------------------------------------------------------------

[2009-05-11 10:40:31] wmeler at wp-sa dot pl

Following patch solves the problem.

diff -urN php-5.3.0RC1/Zend/zend_config.h
php-5.3.0RC1/Zend/zend_config.h
--- php-5.3.0RC1/Zend/zend_config.h     1970-01-01 01:00:00.000000000
+0100
+++ php-5.3.0RC1/Zend/zend_config.h     2009-05-11 11:40:05.408398000
+0200
@@ -0,0 +1,4 @@
+#include <../main/php_config.h>
+#if defined(APACHE) && defined(PHP_API_VERSION)
+#undef HAVE_DLFCN_H
+#endif
diff -urN php-5.3.0RC1/Zend/zend_execute_API.c
php-5.3.0RC1/Zend/zend_execute_API.c
--- php-5.3.0RC1/Zend/zend_execute_API.c        2009-03-19 19:34:16.000000000
+0100
+++ php-5.3.0RC1/Zend/zend_execute_API.c        2009-05-11 11:01:28.663182000
+0200
@@ -185,7 +185,7 @@
        zend_objects_store_init(&EG(objects_store), 1024);
 
        EG(full_tables_cleanup) = 0;
-#ifdef ZEND_WIN32
+#if defined(ZEND_WIN32) || defined(ZTS)
        EG(timed_out) = 0;
 #endif
 
@@ -1280,6 +1280,15 @@
 }
 /* }}} */
 
+static void zend_timeout_signal_proc (int dummy) {
+       TSRMLS_FETCH();
+#ifdef ZTS
+       EG(timed_out) = 1;
+#else 
+       zend_timeout(0);
+#endif
+}
+
 #ifdef ZEND_WIN32
 static LRESULT CALLBACK zend_timeout_WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam) /* {{{ */
 {
@@ -1424,7 +1433,7 @@
                        setitimer(ITIMER_REAL, &t_r, NULL);
                }
                if(reset_signals) {
-                       signal(SIGALRM, zend_timeout);
+                       signal(SIGALRM, zend_timeout_signal_proc`);
                        sigemptyset(&sigset);
                        sigaddset(&sigset, SIGALRM);
                }
@@ -1432,7 +1441,7 @@
                        setitimer(ITIMER_PROF, &t_r, NULL);
                }
                if(reset_signals) {
-                       signal(SIGPROF, zend_timeout);
+                       signal(SIGPROF, zend_timeout_signal_proc);
                        sigemptyset(&sigset);
                        sigaddset(&sigset, SIGPROF);
                }
diff -urN php-5.3.0RC1/Zend/zend_globals.h
php-5.3.0RC1/Zend/zend_globals.h
--- php-5.3.0RC1/Zend/zend_globals.h    2009-03-18 11:18:09.000000000
+0100
+++ php-5.3.0RC1/Zend/zend_globals.h    2009-05-11 10:50:10.810172000
+0200
@@ -213,8 +213,10 @@
        /* for extended information support */
        zend_bool no_extensions;
 
-#ifdef ZEND_WIN32
+#if defined(ZEND_WIN32)||defined(ZTS)
        zend_bool timed_out;
+#endif
+#ifdef ZEND_WIN32
        OSVERSIONINFOEX windows_version_info;
 #endif
 
diff -urN php-5.3.0RC1/Zend/zend_vm_execute.h
php-5.3.0RC1/Zend/zend_vm_execute.h
--- php-5.3.0RC1/Zend/zend_vm_execute.h 2009-03-18 19:49:27.000000000
+0100
+++ php-5.3.0RC1/Zend/zend_vm_execute.h 2009-05-11 10:48:32.487352000
+0200
@@ -95,7 +95,7 @@
        
        while (1) {
        int ret;
-#ifdef ZEND_WIN32
+#if defined(ZEND_WIN32) || defined(ZTS)
                if (EG(timed_out)) {
                        zend_timeout(0);
                }
diff -urN php-5.3.0RC1/Zend/zend_vm_execute.skl
php-5.3.0RC1/Zend/zend_vm_execute.skl
--- php-5.3.0RC1/Zend/zend_vm_execute.skl       2008-06-11 15:18:41.000000000
+0200
+++ php-5.3.0RC1/Zend/zend_vm_execute.skl       2009-05-11 10:48:59.796813000
+0200
@@ -61,7 +61,7 @@
        
        while (1) {
     {%ZEND_VM_CONTINUE_LABEL%}
-#ifdef ZEND_WIN32
+#if defined(ZEND_WIN32) || defined(ZTS)
                if (EG(timed_out)) {
                        zend_timeout(0);
                }

------------------------------------------------------------------------

[2009-03-11 09:14:58] wmeler at wp-sa dot pl

What should I say to make you stop using longjmp family calls in signal
handler? 

IT IS NOT THREAD SAFE !!!

You probably can reproduce it with:

./configure --enable-maintainer-zts; make; sapi/cli/php ../aaa.php

Fatal error: Maximum execution time of 1 second exceeded in
/root/aaa.php on line 7
6504146zend_mm_heap corrupted

aaa.php is a script posted 21 Jul 2003 2:07am UTC.

------------------------------------------------------------------------

[2009-03-10 15:38:56] ka...@php.net

Please try using this CVS snapshot:

  http://snaps.php.net/php5.2-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/

Can you try a recent snapshot? I cannot reproduce this under CLI on
Ubuntu (5.3.0b1) or Windows (5.2.8) with ZTS

------------------------------------------------------------------------

[2004-01-27 03:33:31] wmeler at wp-sa dot pl

Zeev corrected #21513. It won't help.
As long as zend_timeout calls longjmp (through zend_error, php_error_cb
and zend_bailout) shutdown functions can get memory, locks - any objects
in undefined state.
2 years - no change ...

------------------------------------------------------------------------

[2003-08-13 21:43:09] sni...@php.net

I could finally reproduce this. The patches didn't make any
difference.


------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/16820

-- 
Edit this bug report at http://bugs.php.net/?id=16820&edit=1

Reply via email to