| | 2462 | static startup_func_t xc_last_ext_startup; |
| | 2463 | static zend_llist_element *xc_llist_element; |
| | 2464 | static xc_ptr_compare_func(void *p1, void *p2) /* {{{ */ |
| | 2465 | { |
| | 2466 | return p1 == p2; |
| | 2467 | } |
| | 2468 | /* }}} */ |
| | 2469 | static int xc_zend_startup_last(zend_extension *extension) /* {{{ */ |
| | 2470 | { |
| | 2471 | /* restore */ |
| | 2472 | extension->startup = xc_last_ext_startup; |
| | 2473 | if (extension->startup) { |
| | 2474 | if (extension->startup(extension) != SUCCESS) { |
| | 2475 | return FAILURE; |
| | 2476 | } |
| | 2477 | } |
| | 2478 | xc_zend_extension_register(&zend_extension_entry, 0); |
| | 2479 | if (!xc_module_gotup) { |
| | 2480 | return zend_startup_module(&xcache_module_entry); |
| | 2481 | } |
| | 2482 | return SUCCESS; |
| | 2483 | } |
| | 2484 | /* }}} */ |
| 2463 | | if (!xc_module_gotup) { |
| | 2491 | xc_llist_element = NULL; |
| | 2492 | if (zend_llist_count(&zend_extensions) > 1) { |
| | 2493 | zend_llist_position lpos; |
| | 2494 | zend_extension *ext; |
| | 2495 | llist_dtor_func_t dtor; |
| | 2496 | |
| | 2497 | ext = zend_get_extension(XCACHE_NAME); |
| | 2498 | assert(ext); |
| | 2499 | dtor = zend_extensions.dtor; /* avoid dtor */ |
| | 2500 | zend_extensions.dtor = NULL; |
| | 2501 | zend_llist_del_element(&zend_extensions, ext, xc_ptr_compare_func); |
| | 2502 | zend_extensions.dtor = dtor; |
| | 2503 | |
| | 2504 | ext = (zend_extension *) zend_llist_get_last_ex(&zend_extensions, &lpos); |
| | 2505 | assert(ext); |
| | 2506 | xc_last_ext_startup = ext->startup; |
| | 2507 | ext->startup = xc_zend_startup_last; |
| | 2508 | } |
| | 2509 | else if (!xc_module_gotup) { |