Hi: could you file a feature req on bugs.php.net? I think it's okey to add a zend_restore_user_handler .
like: ZEND_API int zend_restore_user_opcode_handler(zend_uchar opcode) { zend_user_opcodes[opcode] = opcode; zend_user_opcode_handlers[opcode] = NULL; return SUCCESS; } but it still need dmitry to review :) thanks On Sun, Feb 12, 2012 at 8:09 PM, yoram bar haim <yora...@zend.com> wrote: > I first saw this problem while addapting extension to PHP 5.4 but the code is > the same in 5.3 : > when you call zend_set_user_opcode_handler() it set's a pointer (handler) in > zend_user_opcode_handlers and a uint opcode value in zend_user_opcodes to > ZEND_USER_OPCODE . > > you can call zend_set_user_opcode_handler with the original handler to restore > it, but if the original state did not include ZEND_USER_OPCODE you have no way > to restore it. > > Why restoring ? > On mac, static variables are not re-initialized on dlclose()+dlopen(). that > means that apache reload does not re-create zend_user_opcode_handlers and > zend_user_opcodes. > if your extension sets user_opcode_handler and is not reloaded in apache > reload (because you commented it in php.ini, for example), your handlers array > will actually point to non-exist handler. > if you will call zend_set_user_opcode_handler() with the original handler at > MSHUTDOWN, it will restore the handler but zend_user_opcodes[<opcode] will > still be ZEND_USER_OPCODE so you will end up calling a NULL handler. > > we should eather allow zend_set_user_opcode_handler to also set the value in > zend_user_opcodes[<opcode>] or we should build those arrayes from scratch at > php_module_init. > > currently an extension tha calls zend_set_user_opcode_handler() will make PHP > crash on mac after disabling the extension and apache reload. > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > -- Laruence Xinchen Hui http://www.laruence.com/ -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php