Derived from: https://github.com/krakjoe/parallel/pull/339 Just removed tests. From 75d1359e671fbb05c813779a0ad885eabc636633 Mon Sep 17 00:00:00 2001 From: Florian Engelhardt Date: Wed, 9 Apr 2025 10:14:12 +0200 Subject: [PATCH] Crash less and allow more cyclomatic refs (#339) --- src/cache.c | 17 +++++++++++- src/scheduler.c | 9 +++++-- 8 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 tests/base/072-bootstrap.php diff --git a/src/cache.c b/src/cache.c index 6c3dee9..afbfb6d 100644 --- a/src/cache.c +++ b/src/cache.c @@ -370,11 +370,12 @@ zend_function* php_parallel_cache_closure(const zend_function *source, zend_func memcpy(closure, cache, sizeof(zend_op_array)); } - if (closure->op_array.static_variables) { + if (source->op_array.static_variables) { HashTable *statics = ZEND_MAP_PTR_GET( source->op_array.static_variables_ptr); + if (statics) { closure->op_array.static_variables = php_parallel_copy_hash_ctor(statics, 1); @@ -387,8 +388,22 @@ zend_function* php_parallel_cache_closure(const zend_function *source, zend_func closure->op_array.static_variables_ptr, &closure->op_array.static_variables); #endif + } } +#if PHP_VERSION_ID >= 80100 + if (source->op_array.num_dynamic_func_defs) { + uint32_t it = 0; + closure->op_array.dynamic_func_defs = php_parallel_cache_copy_mem( + source->op_array.dynamic_func_defs, + sizeof(zend_op_array*) * source->op_array.num_dynamic_func_defs); + while (it < source->op_array.num_dynamic_func_defs) { + closure->op_array.dynamic_func_defs[it] = (zend_op_array*) php_parallel_cache_closure((zend_function*) source->op_array.dynamic_func_defs[it], NULL); + it++; + } + } +#endif + return closure; } /* }}} */ diff --git a/src/scheduler.c b/src/scheduler.c index a66673b..de3ee11 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -33,6 +33,8 @@ static zend_always_inline int php_parallel_scheduler_list_delete(void *lhs, void static void php_parallel_schedule_free_function(zend_function *function) { if (function->op_array.static_variables) { php_parallel_copy_hash_dtor(function->op_array.static_variables, 1); + ZEND_MAP_PTR_SET(function->op_array.static_variables_ptr, NULL); + function->op_array.static_variables = NULL; } #if PHP_VERSION_ID >= 80100 @@ -245,6 +247,8 @@ static void php_parallel_scheduler_clean(zend_function *function) { if (!(GC_FLAGS(statics) & IS_ARRAY_IMMUTABLE)) { zend_array_destroy(statics); + ZEND_MAP_PTR_SET(function->op_array.static_variables_ptr, NULL); + function->op_array.static_variables = NULL; } } @@ -254,8 +258,9 @@ static void php_parallel_scheduler_clean(zend_function *function) { while (it < function->op_array.num_dynamic_func_defs) { php_parallel_scheduler_clean( - (zend_function*) function->op_array.dynamic_func_defs[it]); - it++; + (zend_function*) function->op_array.dynamic_func_defs[it]); + pefree(function->op_array.dynamic_func_defs[it],1); + it++; } } #endif