Re: ISAPI Crash Debugging Notes
| From: | Michael Sisolak | Date: | Tue, 27 Aug 2002 13:42:32 +0000 |
| Subject: | Re: ISAPI Crash Debugging Notes | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-87526@lists.php.net to get a copy of this message | ||
--- Zeev Suraski <zeev@zend.com> wrote:
> At 09:53 27/08/2002, Michael Sisolak wrote:
> > > >i've been doing some debugging of the crashes when running php
> under
> > > >the isapi sapi. is anybody else currently looking at this? if
> you
> > > >are let's talk - here are my notes so far.
> > >
> > > first off, can you try using
> > > http://www.php.net/~zeev/php-4.2.3rc1.tar.gz
> > > and see if you experience the same problems? i've made some
> > > thread-safety related fixes there, even though none should lead
> > > to a hard crash...
> >
> >zeev,
> >
> >i believe that i may have tracked down a major isapi filter
> >thread-safety hole. if i understand what zend_startup() is doing
> >correctly, it assumes that the thread that it runs under will not
> also
> >be used to serve http requests.
>
> No, the startup thread can be used as a regular HTTP thread, nothing
> in the
> code should prevent that.
> The globals code in the startup sequence is very tricky, but it
> should work.
This is a sample of the debug output that I'm seeing (this is PHP 4.2.1
running under Windows 2000 Professional, single CPU):
[1948] the startup thread is 1956
[1948] GLOBAL_FUNCTION_TABLE is 4226120
[1948] in HttpExtensionProc thread 1956, CG(function_table) is 4226120
[1948] in HttpExtensionProc thread 1520, CG(function_table) is 18834536
[1948] in HttpExtensionProc thread 920, CG(function_table) is 18838912
[1948] in HttpExtensionProc thread 1956, CG(function_table) is 4226120
[1948] in HttpExtensionProc thread 1256, CG(function_table) is 19250808
[1948] in HttpExtensionProc thread 920, CG(function_table) is 18838912
[1948] in HttpExtensionProc thread 1956, CG(function_table) is 4226120
Notice that the initial thread (1956) appears to continue to use
GLOBAL_FUNCTION_TABLE as it's own CG(function_table). I'm reporting
the GLOBAL_FUNCTION_TABLE value from within zend_startup() - is there
some point later in the code that makes it okay that this is the same
value that I get for a CG(function_table) later?
> Either way - starting threads from an ISAPI filter/extension is
> completely
> forbidden (or at least strongly discouraged) so even if there is some
> bug
> in there, starting our own thread is not an option.
I don't believe that this is true. In this sample on MSDN:
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q197728
their code for GetExtensionVersion calls AfxBeginThread. Also in this
document:
http://msdn.microsoft.com/library/en-us/vccore/html/vcconatlserverandcom.asp
point 1 recommends "Create your own thread in GetExtensionVersion on
which you can initialize COM..."
> Can you give me the data I mentioned in the previous letter?
This is PHP 4.2.1 running under Windows 2000 Professional (SP3) on a
single CPU system. I can't really send the code as I'm currently
testing with a large application that I have been running under CGI.
I'll see if I can come up with a simpler example that causes the crash,
but the debug output above would be the same either way. Please let me
know if there is anything else I can provide to help in tracking this
down.
Michael Sisolak
msisolak@gvpi.com
__________________________________________________
Do You Yahoo!?
Yahoo! Finance - Get real-time stock quotes
http://finance.yahoo.com