Sharing resources between modules

php.internals

Marshall A. Greenblatt

23 years ago
Hi guys, a quick question: Is it possible for one module to retrieve the resource structure registered by another module? For instance, assume that we have two loaded PHP modules, `php_a.so' and `php_b.so'. A script calls a PHP function defined in `php_a.so'. That function creates a structure, calls zend_register_resource(), and returns the resource ID. That same script then calls a PHP function defined in `php_b.so' that accepts the resource ID as a parameter. Would it be possible for the function in `php_b.so' to retrieve the structure associated with the resource ID registered in `php_a.so'? My thinking is that something like the following (semi-psudocode) should work: In the `php_a.so' function, which creates the resource: zval *myzvalp; mystruct *mystructp = emalloc(sizeof(mystruct)); MAKE_STD_ZVAL(myzvalp); zend_register_resource(myzvalp, mystructp, "my structure"); RETURN_RESOURCE(myzvalp); In the `php_b.so' function, which retrieves the resource: int res_type; mystruct *mystructp; zval *myzvalp; [ get myzvalp from the parameter list ] res_type = zend_fetch_list_dtor_id("my structure"); mystructp = (mystruct*)zend_fetch_resource(&myzvalp TSRMLS_CC, -1, "my structure", NULL, 1, res_type); if(mystructp) { [ mystructp should be the same as allocated in `php_a.so' ] } However, I see the `TSRMLS_CC' value in the zend_fetch_resource() call and this makes me wonder if zend_fetch_resource() is using something specific to the current module. Also, I'm guessing at the use of the zend_fetch_list_dtor_id() function, so any suggestions about a more appropriate way to do this (or a pointer to code where this is currently being done) would be appreciated. Thanks, Marshall

Wez Furlong

23 years ago
Yes, it is possible; you will need to know the list entry id in advance, so it needs to be exported from one module either as a global variable or as the return value from a function. TSRMLS stuff is used in thread-safe builds as a means to reduce TLS overhead; it will not affect you intended usage. BTW: ZEND_REGISTER_RESOURCE and ZEND_FETCH_RESOURCE macros might make your code slightly easier to write. --Wez. On Sat, 19 Apr 2003, Marshall A. Greenblatt wrote:

Marshall A. Greenblatt

23 years ago
----- Original Message ----- From: "Marshall A. Greenblatt" <marshall@magpcss.com> To: <internals@lists.php.net> Sent: Saturday, April 19, 2003 3:20 AM Subject: [PHP-DEV] Sharing resources between modules
> Hi guys, a quick question: > > Is it possible for one module to retrieve the resource structure
registered
> by another module? >
[snip]
> res_type = zend_fetch_list_dtor_id("my structure"); > mystructp = (mystruct*)zend_fetch_resource(&myzvalp TSRMLS_CC, > -1, "my structure", > NULL, 1, res_type);
[snip] The zend_fetch_list_dtor_id() function works as I expected; it returns the resource type ID for the specified resource name, irregardless of what module that ID was originally registered in. As long as both modules know the name of the resource, I don't have to export the value returned from zend_register_list_destructors_ex(). Thanks for the response Wez! - Marshall