On Wed, 25 Nov 2015 18:45:48 +0100 "Anatol Belski" <anatol....@belski.net> wrote:
> Hi Ruslan, > > > -----Original Message----- > > From: Ruslan Osmanov [mailto:rrosma...@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 <rrosma...@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 `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
signature.asc
Description: PGP signature