Skip to content

Commit 7e9e31a

Browse files
committed
* Fixed correct handling of multiple SAPI initializations for PHPDBG.
1 parent daac306 commit 7e9e31a

File tree

2 files changed

+43
-24
lines changed

2 files changed

+43
-24
lines changed

Zend/zend_async_API.c

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ static zend_class_entry * get_class_ce(zend_async_class type)
6060
return NULL;
6161
}
6262

63-
static zend_string * scheduler_module_name = NULL;
63+
static zend_atomic_bool scheduler_lock = {0};
64+
static char * scheduler_module_name = NULL;
6465
zend_async_spawn_t zend_async_spawn_fn = spawn;
6566
zend_async_new_coroutine_t zend_async_new_coroutine_fn = NULL;
6667
zend_async_new_scope_t zend_async_new_scope_fn = NULL;
@@ -74,7 +75,8 @@ zend_async_add_microtask_t zend_async_add_microtask_fn = NULL;
7475
zend_async_get_awaiting_info_t zend_async_get_awaiting_info_fn = NULL;
7576
zend_async_get_class_ce_t zend_async_get_class_ce_fn = get_class_ce;
7677

77-
static zend_string * reactor_module_name = NULL;
78+
static zend_atomic_bool reactor_lock = {0};
79+
static char * reactor_module_name = NULL;
7880
zend_async_reactor_startup_t zend_async_reactor_startup_fn = NULL;
7981
zend_async_reactor_shutdown_t zend_async_reactor_shutdown_fn = NULL;
8082
zend_async_reactor_execute_t zend_async_reactor_execute_fn = NULL;
@@ -173,8 +175,8 @@ ZEND_API int zend_async_get_api_version_number(void)
173175
return ZEND_ASYNC_API_VERSION_NUMBER;
174176
}
175177

176-
ZEND_API void zend_async_scheduler_register(
177-
zend_string *module,
178+
ZEND_API bool zend_async_scheduler_register(
179+
char *module,
178180
bool allow_override,
179181
zend_async_new_coroutine_t new_coroutine_fn,
180182
zend_async_new_scope_t new_scope_fn,
@@ -191,19 +193,24 @@ ZEND_API void zend_async_scheduler_register(
191193
zend_async_get_class_ce_t get_class_ce_fn
192194
)
193195
{
196+
if (zend_atomic_bool_exchange(&scheduler_lock, 1)) {
197+
return false;
198+
}
199+
200+
if (scheduler_module_name == module) {
201+
return true;
202+
}
203+
194204
if (scheduler_module_name != NULL && false == allow_override) {
205+
zend_atomic_bool_store(&scheduler_lock, 0);
195206
zend_error(
196207
E_CORE_ERROR, "The module %s is trying to override Scheduler, which was registered by the module %s.",
197-
ZSTR_VAL(module), ZSTR_VAL(scheduler_module_name)
208+
module, scheduler_module_name
198209
);
199-
return;
210+
return false;
200211
}
201212

202-
if (scheduler_module_name != NULL) {
203-
zend_string_release(scheduler_module_name);
204-
}
205-
206-
scheduler_module_name = zend_string_copy(module);
213+
scheduler_module_name = module;
207214

208215
zend_async_new_coroutine_fn = new_coroutine_fn;
209216
zend_async_new_scope_fn = new_scope_fn;
@@ -218,10 +225,14 @@ ZEND_API void zend_async_scheduler_register(
218225
zend_async_add_microtask_fn = add_microtask_fn;
219226
zend_async_get_awaiting_info_fn = get_awaiting_info_fn;
220227
zend_async_get_class_ce_fn = get_class_ce_fn;
228+
229+
zend_atomic_bool_store(&scheduler_lock, 0);
230+
231+
return true;
221232
}
222233

223-
ZEND_API void zend_async_reactor_register(
224-
zend_string *module,
234+
ZEND_API bool zend_async_reactor_register(
235+
char *module,
225236
bool allow_override,
226237
zend_async_reactor_startup_t reactor_startup_fn,
227238
zend_async_reactor_shutdown_t reactor_shutdown_fn,
@@ -240,19 +251,23 @@ ZEND_API void zend_async_reactor_register(
240251
zend_async_exec_t exec_fn
241252
)
242253
{
254+
if (zend_atomic_bool_exchange(&reactor_lock, 1)) {
255+
return false;
256+
}
257+
258+
if (reactor_module_name == module) {
259+
return true;
260+
}
261+
243262
if (reactor_module_name != NULL && false == allow_override) {
244263
zend_error(
245264
E_CORE_ERROR, "The module %s is trying to override Reactor, which was registered by the module %s.",
246-
ZSTR_VAL(module), ZSTR_VAL(reactor_module_name)
265+
module, reactor_module_name
247266
);
248-
return;
267+
return false;
249268
}
250269

251-
if (reactor_module_name != NULL) {
252-
zend_string_release(reactor_module_name);
253-
}
254-
255-
reactor_module_name = zend_string_copy(module);
270+
reactor_module_name = module;
256271

257272
zend_async_reactor_startup_fn = reactor_startup_fn;
258273
zend_async_reactor_shutdown_fn = reactor_shutdown_fn;
@@ -273,6 +288,10 @@ ZEND_API void zend_async_reactor_register(
273288

274289
zend_async_new_exec_event_fn = new_exec_event_fn;
275290
zend_async_exec_fn = exec_fn;
291+
292+
zend_atomic_bool_store(&reactor_lock, 0);
293+
294+
return true;
276295
}
277296

278297
ZEND_API void zend_async_thread_pool_register(zend_string *module, bool allow_override, zend_async_queue_task_t queue_task_fn)

Zend/zend_async_API.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -944,8 +944,8 @@ ZEND_API extern zend_async_exec_t zend_async_exec_fn;
944944
ZEND_API bool zend_async_thread_pool_is_enabled(void);
945945
ZEND_API extern zend_async_queue_task_t zend_async_queue_task_fn;
946946

947-
ZEND_API void zend_async_scheduler_register(
948-
zend_string *module,
947+
ZEND_API bool zend_async_scheduler_register(
948+
char *module,
949949
bool allow_override,
950950
zend_async_new_coroutine_t new_coroutine_fn,
951951
zend_async_new_scope_t new_scope_fn,
@@ -962,8 +962,8 @@ ZEND_API void zend_async_scheduler_register(
962962
zend_async_get_class_ce_t get_class_ce_fn
963963
);
964964

965-
ZEND_API void zend_async_reactor_register(
966-
zend_string *module,
965+
ZEND_API bool zend_async_reactor_register(
966+
char *module,
967967
bool allow_override,
968968
zend_async_reactor_startup_t reactor_startup_fn,
969969
zend_async_reactor_shutdown_t reactor_shutdown_fn,

0 commit comments

Comments
 (0)