summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Fuhrmannek2021-08-18 10:54:58 +0200
committerBen Fuhrmannek2021-08-18 10:54:58 +0200
commit627932d1eb9cfa88c72df66e51f520e987d7655e (patch)
tree45ffab040b01b1fb4f62216182d11b257bb922f4
parenta67fd0af43e0cc786069bba4539e28eccdcb12b0 (diff)
start SP as late as possible. this allows us to hook functions of extensions supposed to be loaded later
-rw-r--r--src/snuffleupagus.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/snuffleupagus.c b/src/snuffleupagus.c
index 3ad47d5..650e5e4 100644
--- a/src/snuffleupagus.c
+++ b/src/snuffleupagus.c
@@ -73,6 +73,26 @@ ZEND_DLEXPORT zend_extension zend_extension_entry = {
73 NULL, /* op_array_dtor_func_t */ 73 NULL, /* op_array_dtor_func_t */
74 STANDARD_ZEND_EXTENSION_PROPERTIES}; 74 STANDARD_ZEND_EXTENSION_PROPERTIES};
75 75
76static void sp_load_other_modules() {
77 // try to load other modules before initializing Snuffleupagus
78 zend_module_entry *module;
79 bool should_start = false;
80 ZEND_HASH_FOREACH_PTR(&module_registry, module) {
81 if (should_start) {
82 sp_log_debug("attempting to start module '%s' early", module->name);
83 if (zend_startup_module_ex(module) != SUCCESS) {
84 // startup failed. let's try again later.
85 module->module_started = 0;
86 }
87 }
88 if (strcmp(module->name, PHP_SNUFFLEUPAGUS_EXTNAME) == 0) {
89 should_start = true;
90 }
91 } ZEND_HASH_FOREACH_END();
92
93
94}
95
76static PHP_GINIT_FUNCTION(snuffleupagus) { 96static PHP_GINIT_FUNCTION(snuffleupagus) {
77#ifdef SP_DEBUG_STDERR 97#ifdef SP_DEBUG_STDERR
78 if (getenv("SP_NODEBUG")) { 98 if (getenv("SP_NODEBUG")) {
@@ -82,6 +102,7 @@ static PHP_GINIT_FUNCTION(snuffleupagus) {
82 } 102 }
83#endif 103#endif
84 sp_log_debug("(GINIT)"); 104 sp_log_debug("(GINIT)");
105 sp_load_other_modules();
85 snuffleupagus_globals->is_config_valid = SP_CONFIG_NONE; 106 snuffleupagus_globals->is_config_valid = SP_CONFIG_NONE;
86 snuffleupagus_globals->in_eval = 0; 107 snuffleupagus_globals->in_eval = 0;
87 108