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