Skip to content

Commit ce5c1d7

Browse files
committed
% prepare code for zend_call_destructors
1 parent 9301b6c commit ce5c1d7

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

Zend/zend.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,11 @@ ZEND_API void zend_activate(void) /* {{{ */
13351335
void zend_call_destructors(void) /* {{{ */
13361336
{
13371337
zend_try {
1338+
#ifdef PHP_ASYNC_API
1339+
async_shutdown_destructors();
1340+
#else
13381341
shutdown_destructors();
1342+
#endif
13391343
} zend_end_try();
13401344
}
13411345
/* }}} */
@@ -1352,6 +1356,12 @@ ZEND_API void zend_deactivate(void) /* {{{ */
13521356
/* shutdown_executor() takes care of its own bailout handling */
13531357
shutdown_executor();
13541358

1359+
#ifdef PHP_ASYNC_API
1360+
// The execution of the True Async API should end here,
1361+
// after the GC has been run.
1362+
ZEND_ASYNC_ENGINE_SHUTDOWN();
1363+
#endif
1364+
13551365
zend_try {
13561366
zend_ini_deactivate();
13571367
} zend_end_try();

Zend/zend_async_API.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ zend_async_resume_t zend_async_resume_fn = NULL;
8282
zend_async_cancel_t zend_async_cancel_fn = NULL;
8383
zend_async_spawn_and_throw_t zend_async_spawn_and_throw_fn = spawn_and_throw;
8484
zend_async_shutdown_t zend_async_shutdown_fn = NULL;
85+
zend_async_engine_shutdown_t zend_async_engine_shutdown_fn = NULL;
8586
zend_async_get_coroutines_t zend_async_get_coroutines_fn = NULL;
8687
zend_async_add_microtask_t zend_async_add_microtask_fn = NULL;
8788
zend_async_get_awaiting_info_t zend_async_get_awaiting_info_fn = NULL;
@@ -215,7 +216,8 @@ ZEND_API bool zend_async_scheduler_register(
215216
zend_async_add_microtask_t add_microtask_fn,
216217
zend_async_get_awaiting_info_t get_awaiting_info_fn,
217218
zend_async_get_class_ce_t get_class_ce_fn,
218-
zend_async_new_iterator_t new_iterator_fn
219+
zend_async_new_iterator_t new_iterator_fn,
220+
zend_async_engine_shutdown_t engine_shutdown_fn
219221
)
220222
{
221223
if (zend_atomic_bool_exchange(&scheduler_lock, 1)) {
@@ -252,6 +254,7 @@ ZEND_API bool zend_async_scheduler_register(
252254
zend_async_get_awaiting_info_fn = get_awaiting_info_fn;
253255
zend_async_get_class_ce_fn = get_class_ce_fn;
254256
zend_async_new_iterator_fn = new_iterator_fn;
257+
zend_async_engine_shutdown_fn = engine_shutdown_fn;
255258

256259
zend_atomic_bool_store(&scheduler_lock, 0);
257260

Zend/zend_async_API.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ typedef void (*zend_async_resume_t)(zend_coroutine_t *coroutine, zend_object * e
193193
typedef void (*zend_async_cancel_t)(zend_coroutine_t *coroutine, zend_object * error, bool transfer_error, const bool is_safely);
194194
typedef bool (*zend_async_spawn_and_throw_t)(zend_object *exception, zend_async_scope_t *scope, int32_t priority);
195195
typedef void (*zend_async_shutdown_t)(void);
196+
typedef void (*zend_async_engine_shutdown_t)(void);
196197
typedef zend_array* (*zend_async_get_coroutines_t)(void);
197198
typedef void (*zend_async_add_microtask_t)(zend_async_microtask_t *microtask);
198199
typedef zend_array* (*zend_async_get_awaiting_info_t)(zend_coroutine_t * coroutine);
@@ -1113,6 +1114,7 @@ ZEND_API extern zend_async_resume_t zend_async_resume_fn;
11131114
ZEND_API extern zend_async_cancel_t zend_async_cancel_fn;
11141115
ZEND_API extern zend_async_spawn_and_throw_t zend_async_spawn_and_throw_fn;
11151116
ZEND_API extern zend_async_shutdown_t zend_async_shutdown_fn;
1117+
ZEND_API extern zend_async_engine_shutdown_t zend_async_engine_shutdown_fn;
11161118
ZEND_API extern zend_async_get_coroutines_t zend_async_get_coroutines_fn;
11171119
ZEND_API extern zend_async_add_microtask_t zend_async_add_microtask_fn;
11181120
ZEND_API extern zend_async_get_awaiting_info_t zend_async_get_awaiting_info_fn;
@@ -1190,7 +1192,8 @@ ZEND_API bool zend_async_scheduler_register(
11901192
zend_async_add_microtask_t add_microtask_fn,
11911193
zend_async_get_awaiting_info_t get_awaiting_info_fn,
11921194
zend_async_get_class_ce_t get_class_ce_fn,
1193-
zend_async_new_iterator_t new_iterator_fn
1195+
zend_async_new_iterator_t new_iterator_fn,
1196+
zend_async_engine_shutdown_t engine_shutdown_fn
11941197
);
11951198

11961199
ZEND_API bool zend_async_reactor_register(
@@ -1330,6 +1333,7 @@ END_EXTERN_C()
13301333
*/
13311334
#define ZEND_ASYNC_SPAWN_AND_THROW(exception, scope, priority) zend_async_spawn_and_throw_fn(exception, scope, priority)
13321335
#define ZEND_ASYNC_SHUTDOWN() zend_async_shutdown_fn()
1336+
#define ZEND_ASYNC_ENGINE_SHUTDOWN() zend_async_engine_shutdown_fn()
13331337
#define ZEND_ASYNC_GET_COROUTINES() zend_async_get_coroutines_fn()
13341338
#define ZEND_ASYNC_ADD_MICROTASK(microtask) zend_async_add_microtask_fn(microtask)
13351339
#define ZEND_ASYNC_GET_AWAITING_INFO(coroutine) zend_async_get_awaiting_info_fn(coroutine)

0 commit comments

Comments
 (0)