Re: Re: How do I save TSRMLS_CACHE for a new thread in PHP7?
| From: | Ruslan Osmanov | Date: | Wed, 25 Nov 2015 19:25:28 +0000 |
| Subject: | Re: Re: How do I save TSRMLS_CACHE for a new thread in PHP7? | ||
| References: | 1 2 3 | Groups: | php.pecl.dev |
| Request: | Send a blank email to pecl-dev+get-13360@lists.php.net to get a copy of this message | ||
On Wed, 25 Nov 2015 18:45:48 +0100
"Anatol Belski" <anatol.php@belski.net> wrote:
> Hi Ruslan,
>
> > -----Original Message-----
> > From: Ruslan Osmanov [mailto:rrosmanov@gmail.com]
> > Sent: Wednesday, November 25, 2015 5:47 PM
> > To: PECL Developers <pecl-dev@lists.php.net>
> > Subject: [PECL-DEV] Re: How do I save TSRMLS_CACHE for a new thread
> > in PHP7?
> >
> > What do I do now?
> >
> > On Sun, 22 Nov 2015 11:42:45 +0500
> > Ruslan Osmanov <rrosmanov@gmail.com> wrote:
> >
> > > Hi,
> > >
> > > suppose we are using Zend API in a new thread (created by
> > > extension). The problem that Zend API context(ZEND_TSRMLS_CACHE)
> > > is a thread-local variable.
> > >
> > > I'm looking for a way to pass ZEND_TSRMLS_CACHE to my thread. I'm
> > > used to use TSRMLS_FETCH_FROM_CTX(thread_data) and
> > > TSRMLS_SET_CTX(thread_data) in previous PHP versions. Now, in PHP7
> > > they are not working - _tsrm_ls_cache is equal to zero within
> > > thread function:
> > >
> > > (gdb) print _tsrm_ls_cache
> > > void* 0x0
> > >
> > > Well, as I've mentioned, I'm aware of that ZEND_TSRMLS_CACHE is a
> > > thread-local variable. Probably, the OS kernel took care of
> > > keeping thread-local data thread-local, and that's why I can't
> > > access the "saved" thread context.
> > >
> > > But then how am I supposed to use Zend API working with ZTS in my
> > > own thread?
> > >
> I'm not quite sure what exactly you're doing.
>
> If you need some data from another thread, you can pass it to your new
> thread callback. It is correct, ZEND_TSRMLS_CACHE is thread local and
> cannot be passed to another thread. But the data can be passed,
> especially for the read only cases. And you also should ensure that
> PHP request doesn't end while your thread is running.
>
> Regards
>
> Anatol
I'll try to explain the problem.
I have a function(let's call it
Attachment: [application/pgp-signature] signature.asc
execF), which is passed to a
library(libeio) as a callback. This function is invoked afterwards by
the library in separate thread.
The function is calling Zend API, particularly ZVAL_STRINGL(). The
Zend API uses TSRMLS_CACHE internally. For instance, ZVAL_STRINGL()
allocates zend_string which implies using AG() macro. The AG() macro
relies on TSRMLS_CACHE.
Since TSRMLS_CACHE becomes invalid in new thread, the AG() macro (as
well as other macros relying on TSRMLS_CACHE) fails with segmentation
fault.
--
Ruslan Osmanov
Attachment: [application/pgp-signature] signature.asc