diff --git a/xcache.c b/xcache.c index 4d0df28..3d70914 100644 --- a/xcache.c +++ b/xcache.c @@ -1637,6 +1637,7 @@ static void xc_compile_php(xc_compiler_t *compiler, zend_file_handle *h, int typ } if (!XG(initial_compile_file_called)) { + TRACE("%s", "!initial_compile_file_called, give up"); return; } @@ -2438,9 +2439,6 @@ static int xc_init(int module_number TSRMLS_DC) /* {{{ */ } if (xc_php_size) { - old_compile_file = zend_compile_file; - zend_compile_file = xc_compile_file; - CHECK(xc_php_caches = xc_cache_init(xc_shm, &xc_php_hcache, &xc_php_hentry, &xc_php_hentry, xc_php_size), "failed init opcode cache"); } @@ -3524,8 +3522,16 @@ static void xcache_signal_handler(int sig) /* {{{ */ /* }}} */ #endif +static void xc_zend_startup_last() /* {{{ */ +{ + if (xc_php_size) { + old_compile_file = zend_compile_file; + zend_compile_file = xc_compile_file; + } +} +/* }}} */ static startup_func_t xc_last_ext_startup; -static int xc_zend_startup_last(zend_extension *extension) /* {{{ */ +static int xc_zend_startup_last_hook(zend_extension *extension) /* {{{ */ { zend_extension *ext = zend_get_extension(XCACHE_NAME); if (ext) { @@ -3540,15 +3546,15 @@ static int xc_zend_startup_last(zend_extension *extension) /* {{{ */ } assert(xc_llist_zend_extension); xcache_llist_prepend(&zend_extensions, xc_llist_zend_extension); + + xc_zend_startup_last(); return SUCCESS; } /* }}} */ static int xc_zend_startup(zend_extension *extension) /* {{{ */ { - if (!origin_compile_file) { - origin_compile_file = zend_compile_file; - zend_compile_file = xc_check_initial_compile_file; - } + origin_compile_file = zend_compile_file; + zend_compile_file = xc_check_initial_compile_file; if (zend_llist_count(&zend_extensions) > 1) { zend_llist_position lpos; @@ -3558,13 +3564,18 @@ static int xc_zend_startup(zend_extension *extension) /* {{{ */ if (xc_llist_zend_extension != zend_extensions.head) { zend_error(E_WARNING, "XCache failed to load itself as the first zend_extension. compatibility downgraded"); } + /* hide myself */ + /* TODO: hide handle sub modules */ xcache_llist_unlink(&zend_extensions, xc_llist_zend_extension); ext = (zend_extension *) zend_llist_get_last_ex(&zend_extensions, &lpos); assert(ext && ext != (zend_extension *) xc_llist_zend_extension->data); xc_last_ext_startup = ext->startup; - ext->startup = xc_zend_startup_last; + ext->startup = xc_zend_startup_last_hook; + } + else { + xc_zend_startup_last(); } return SUCCESS; }