At 20:59 30/03/2002, Markus Fischer wrote: > Yes, exactly. Ok, in that case, by default this won't work 'very nicely' with PHP (because it's not very standard), but you should be able to get it to work relatively easily.
The problem: All of PHP's resources (globals, memory management, resource lists, basically everything) are locked to a specific thread. If you use all of the standard macros (TSRMLS_FETCH(), TSRMLS_DC, etc.) then your code lives entirely within the thread in which it's running, and cannot access anything from other threads. The solution: If you need to manipulate resources of another thread, you can do so, but you have to do a bit of hacking on your own. 1. When you register the callback, you have to remember which thread you'd want to interface with when the callback is called. You can obtain the thread id by using tsrm_thread_id(): THREAD_T thread_id = tsrm_thread_id(); You have to store this information in a place which would be later accessible from the callback. 2. inside the callback, don't use TSRMLS_FETCH(). Instead, use the following line of code: void ***tsrm_ls = (void ***) ts_resource_ex(0, &thread_id); 3. It's important to remember that there are some things that you must not do inside your callback, due to mutual exclusion problems. For instance, doing any 'writes' to the resource lists, or even the memory manager - is likely to cause a crash due to race conditions with the thread that owns these resources. As long as you limit yourself to read-only data, it should be fine (even though I don't think we ever made sure that the data structures are safe for reading while another thread writes to them). That's about all I can tell you, other than good luck, and don't do it unless you really have to :) Zeev -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php