RE: ZTS improvement idea
| From: | Anatol Belski | Date: | Mon, 04 Mar 2019 14:00:54 +0000 |
| Subject: | RE: ZTS improvement idea | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-104577@lists.php.net to get a copy of this message | ||
Hi Dmitry,
> -----Original Message-----
> From: Dmitry Stogov <dmitry@zend.com>
> Sent: Friday, February 15, 2019 8:12 AM
> To: Anatol Belski <ab@php.net>; Joe Watkins <krakjoe@gmail.com>; Bob
> Weinand <bwoebi@php.net>; Nikita Popov <nikic@php.net>; zeev@php.net
> Cc: PHP internals <internals@lists.php.net>
> Subject: Re: ZTS improvement idea
>
> Hi Anatol,
>
> On 2/14/19 8:44 PM, Anatol Belski wrote:
> > Hi Dmitry,
> >
> >> -----Original Message-----
> >> From: Dmitry Stogov <dmitry@zend.com>
> >> Sent: Wednesday, February 13, 2019 12:26 AM
> >> To: Joe Watkins <krakjoe@gmail.com>; Bob Weinand
> <bwoebi@php.net>;
> >> Nikita Popov <nikic@php.net>; Anatol Belski (ab@php.net)
> >> <ab@php.net>; zeev@php.net
> >> Cc: PHP internals <internals@lists.php.net>
> >> Subject: ZTS improvement idea
> >>
> >> Hi,
> >>
> >>
> >>
> >>
> >> After JIT+ZTS related discussion with Joe and Bob, and some related
> >> analyzes.
> >>
> >> I came to more or less formed design idea and described it at
> >> https://wiki.php.net/zts-improvement
> >>
> > I thought about it as well. The reason for the additional dereference >
> levels is probably ,that every globals structure has its own size.
> > That way, it needs to go on the heap.
>
> Not necessary. In case all the structures are known at MINIT time, we may
> realloc()-ate the whole flattened tsrm_tls_entry and then access data faster.
>
> It may be a problem with dl(), but it must already be problematic in ZTS build.
I was doing some research on this. Depending on how far we want to go, with the current approach
there seems to be an issue. The current flow is as follows
- core allocate tsrm_tls_entry entry
- core puts it into TLS
- TSRMLS_CACHE pointer gets updated in the core
- any shared ext updates TSRMLS_CACHE
- any globals are accessed using that same TSRMLS_CACHE pointer, disregarding shared or static ext
The TSRMLS_CACHE pointer is updated by a tsrm_get_ls_cache() call once in GINIt or alike.
That's a real function, has to be, as TSRMLS_CACHE can't be exported. Exts not having
ZEND_ENABLE_STATIC_TSRMLS_CACHE implemented would do that call on every global access.
The actual issue, assumed we reallocate, the TSRMLS_CACHE pointer would change and we need to
overwrite it in TLS. That's ok for all the static stuff, but for the dynamic modules will still
have an old TSRMLS_CACHE. Dynamic modules would need to have a way to know, that the TLS pointer has
changed.
There might be a solution requiring a more extensive refactoring. For example, into the module entry
a callback might be included so then the core would go through all the modules and update
TSRMLS_CACHE automatically, once reallocation happens. That might work, but need to experiment more
to have a proof.
If we don't change the existing mechanics, the structure could still be flattened, but as
TSRMLS_CACHE would have to stay same once allocated - the flat structure would exist within
TSRMLS_CACHE (like say turn the current storage array into a contiguous memory chunk) and would need
one additional indirection level to be accessed.
Perhaps a more serious refactoring would be preferable. Perhaps I oversee something, please let me
know.
Regards
Anatol