Hi,

Yes, I have looked for the issue with --with-tsrm-full-__thread-tls and there 
are effectively some issues.

When building PIC code, the used TLS model is a static model which does not 
allow modules to be loaded at run-time. glibc's dlopen() sometimes allow such 
code to be loaded at runtime when it finds some free memory, that's why --with-
tsrm-__thread-tls works, but it is not expected to always work.

So when building PIC code that's expected to work only when the 
server/application links the PHP module, or when using LD_PRELOAD, etc.

Building non-PIC code allows to use a dynamic TLS model, which allows to load 
modules a run-time, but it is less efficient (4.8s in bench.php, still faster 
than unpatched version, even non-PIC, but less efficient).

Regards,

Arnaud

On Tuesday 19 August 2008 06:18:51 Andi Gutmans wrote:
> Hi Arnaud,
> 
> I remember that at the time we looked at thread local storage and there
> were some real issues with it. I can't remember what as it was about 7+
> years ago.
> I will ask Zeev if he remembers and if not search my archives (don't
> have years prior to 2007 indexed :'( ).
> 
> Andi
> 
> 
> 
> 
> > -----Original Message-----
> > From: Arnaud Le Blanc [mailto:[EMAIL PROTECTED]
> > Sent: Saturday, August 16, 2008 7:19 PM
> > To: PHP Development
> > Subject: [PHP-DEV] [PATCH] ZTS as fast as non-ZTS
> > 
> > Hi,
> > 
> > Currently the way globals work forces to pass a thread-local-storage
> pointer
> > across function calls, which involves some overhead. Also, not all
> functions
> > get the pointer as argument and need to use TSRMLS_FETCH(), which is
> slow. For
> > instance emalloc() involves a TSRMLS_FETCH(). An other overhead is
> accessing
> > globals, using multiple pointers in different locations.
> > 
> > The following patch caches each global address in a native TLS
> variable so
> > that accessing a global is as simple as global_name->member. This
> removes the
> > requirement of passing the tls pointer across function calls, so that
> the two
> > major overheads of ZTS builds are avoided.
> > 
> > Globals can optionally be declared statically, which speeds up things
> a bit.
> > 
> > Results in bench.php:
> > non-ZTS:                                            3.7s
> > ZTS unpatched:                                      5.2s
> > ZTS patched:                                        4.0s
> > ZTS patched and static globals:     3.8s
> > 
> > The patch introduces two new macros: TSRMG_D() (declare) and
> TSRMG_DH()
> > (declare, for headers) to declare globals, instead of the current
> "ts_rsrc_id
> > foo_global_id". These macros declare the global id, plus the __thread
> pointer
> > to the global storage.
> > 
> > ts_allocate_id now takes one more callback function as argument to
> bind the
> > global pointer to its storage. This callback is declared in
> TSRMG_D[H]().
> > 
> > As all TSRMLS_* macros now does nothing, it is needed to call
> ts_resource(0)
> > explicitly at least one time in each thread to initialize its storage.
> A new
> > TSRMLS_INIT() macro as been added for this purpose.
> > 
> > All this is disabled by default. --with-tsrm-__thread-tls enables the
> features
> > of the patch, and --with-tsrm-full-__thread-tls enables static
> declaration of
> > globals.
> > 
> > It as been tested on Linux compiled with --disable-all in CLI and a
> bit in
> > Apache2 with the worker MPM. Known issues:
> > - Declaring globals statically (--with-tsrm-full-__thread-tls) causes
> troubles
> > to dlopen(), actually Apache wont load the module at runtime (it works
> with
> > just --with-tsrm-__thread-tls).
> > - The patch assumes that all resources are ts_allocate_id()'ed before
> any
> > other thread calls ts_allocate_id or ts_resource_ex(), which is
> possibly not
> > the case.
> > 
> > The patch needs some tweaks and does not pretend to be included in any
> branch,
> > but I would like to have some comments on it.
> > 
> > The patch: http://arnaud.lb.s3.amazonaws.com/__thread-tls.patch
> > 
> > Regards,
> > 
> > Arnaud
> > 
> > 
> > --
> > PHP Internals - PHP Runtime Development Mailing List
> > To unsubscribe, visit: http://www.php.net/unsub.php
> 
> 


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to