Re: How to embed PHP5 into multi-threaded C app?

From: Date: Tue, 01 Mar 2005 14:52:28 +0000
Subject: Re: How to embed PHP5 into multi-threaded C app?
References: 1 2 3 4 5 6  Groups: php.internals 
Request: Send a blank email to internals+get-15241@lists.php.net to get a copy of this message
The TSRMLS_DC magic parameter passes around the thread-local storage pointer for the thread; the SG() macro uses that information to get at the sapi_globals struct for your thread. You can also stuff your own SAPI related information into SG(server_context), if you are writing a SAPI: ... in my thread init code ... struct my_globals *g = calloc(1, sizeof(*g)); SG(server_context) = g; ... in the ub write callback ... struct my_globals *g = (struct my_globals*)SG(server_context); If TSRMLS_DC is not present in the function declaration, you can use TSRMLS_FETCH() to summon it out of thread-local-storage. --Wez. On Tue, 1 Mar 2005 04:35:43 -0600, Bob Beaty <drbobbeaty@gmail.com> wrote: > Wez, > OK, I'm with you on this so far, but how do you differentiate > ub_write, log_message, and sapi_error on different threads? It would > seem to me that you'd need to have different functions for each thread > as the calls to ub_write don't include some indication of the thread > that this is being called under. > Then again, maybe it's in the php_embed_module if it's tightly bound > to the thread... For example, if I set the title in the thread-bound > php_embed_module to something specific for each thread then check that > within the call to ub_write() I can see who this 'write' belongs to. > If I'm missing the boat on these function callbacks, or there's an > easier way to capture stdout, stderr, etc. in a ZTS-enabled PHP/Zend > environment, please let me know. > I'm sorry if I seem a bit dense, but I'm trying to figure things out > and design the code before I start writing it. > > Bob > > On Feb 28, 2005, at 11:56 PM, Wez Furlong wrote: > > > ZTS enabled PHP has "strong thread affinity". > > Calls into the engine are thread-safe provided that you have > > previously initialized the engine on that thread. > > > > Note that you should not efree() memory allocated on one thread from > > outside of that thread, on pain of segfault. eg: resources from one > > thread cannot be safely passed on to another thread. > > > > --Wez. > > > > > > > > On Mon, 28 Feb 2005 14:24:05 -0600, Bob Beaty <drbobbeaty@gmail.com> > > wrote: > >> Which is my concern. > >> > >> I've looked at the code differences, and it appears that this > >> modification works for running different source files through the > >> engine, but I'm concerned about the safety of zend_eval_string() if I > >> initialize the engine in one thread and then try to have several > >> threads calling zend_eval_string() on different strings. > >> > >> I'm not convinced that simply making the php_embed_module thread-local > >> is going to work either. I'm concerned that the engine was written > >> with > >> the idea that only one thread can be initializing the php_embed_module > >> and making calls to zend_eval_string(). If this is the case, then I'd > >> have to re-write a lot more than php_embed.c to get thread-safety out > >> of the engine. > >> > >> Or am I on the wrong track? > >> > >> Bob > >> > >> > >> On Feb 28, 2005, at 1:08 PM, Vadka wrote: > >> > >>> > >>> On Mon, 28 Feb 2005, Alan Knowles wrote: > >>> > >>>> these still need tidying up alot, but the do work. > >>>> http://docs.akbkhome.com/php_embed.c.txt > >>>> http://docs.akbkhome.com/php_embed.h.txt > >>>> replace the code in php_embed with them, make sure you compile with > >>>> the zts enabled, and the macros's are similar to the original embed > >>>> (use threaded start call at application start up, and thread start > >>>> /start end within the pthread_start(...callback..) method > >>> Thread safeness is not a problem for a single thread. > >>> The problem is to call user functions from different threads > >>> (tsrm_ls pointed to somewhere in different threads, global vars etc > >>> are not protected). > >> Thanks, > >> Bob (drbob@TheManFromSPUD.com) > >> The Man from S.P.U.D. > >> We will write no code before it's designed. > >> > >> > > > > > > Thanks, > Bob (drbob@TheManFromSPUD.com) > The Man from S.P.U.D. > We will write no code before it's designed. > >

« previous php.internals (#15241) next »