Skip to content

Commit d7fbb4d

Browse files
committed
Restore preload state if it was already loaded in another process.
1 parent 0fe9ea1 commit d7fbb4d

File tree

1 file changed

+42
-32
lines changed

1 file changed

+42
-32
lines changed

ext/opcache/ZendAccelerator.c

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3545,11 +3545,7 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
35453545
uint32_t memory_used;
35463546
uint32_t checkpoint;
35473547

3548-
/* exclusive lock */
3549-
zend_shared_alloc_lock();
3550-
35513548
if (zend_accel_hash_is_full(&ZCSG(hash))) {
3552-
zend_shared_alloc_unlock();
35533549
zend_accel_error(ACCEL_LOG_FATAL, "Not enough entries in hash table for preloading!");
35543550
return NULL;
35553551
}
@@ -3602,7 +3598,6 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
36023598
}
36033599
#endif
36043600
if (!ZCG(mem)) {
3605-
zend_shared_alloc_unlock();
36063601
zend_accel_error(ACCEL_LOG_FATAL, "Not enough shared memory for preloading!");
36073602
return NULL;
36083603
}
@@ -3635,11 +3630,37 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
36353630

36363631
new_persistent_script->dynamic_members.memory_consumption = ZEND_ALIGNED_SIZE(new_persistent_script->size);
36373632

3638-
zend_shared_alloc_unlock();
3639-
36403633
return new_persistent_script;
36413634
}
36423635

3636+
static void preload_load(void)
3637+
{
3638+
/* Load into process tables */
3639+
if (zend_hash_num_elements(&ZCSG(preload_script)->script.function_table)) {
3640+
Bucket *p = ZCSG(preload_script)->script.function_table.arData;
3641+
Bucket *end = p + ZCSG(preload_script)->script.function_table.nNumUsed;
3642+
3643+
for (; p != end; p++) {
3644+
_zend_hash_append_ptr_ex(EG(function_table), p->key, Z_PTR(p->val), 1);
3645+
}
3646+
}
3647+
3648+
if (zend_hash_num_elements(&ZCSG(preload_script)->script.class_table)) {
3649+
Bucket *p = ZCSG(preload_script)->script.class_table.arData;
3650+
Bucket *end = p + ZCSG(preload_script)->script.class_table.nNumUsed;
3651+
3652+
for (; p != end; p++) {
3653+
_zend_hash_append_ptr_ex(EG(class_table), p->key, Z_PTR(p->val), 1);
3654+
}
3655+
}
3656+
3657+
EG(persistent_constants_count) = EG(zend_constants)->nNumUsed;
3658+
EG(persistent_functions_count) = EG(function_table)->nNumUsed;
3659+
EG(persistent_classes_count) = EG(class_table)->nNumUsed;
3660+
3661+
CG(map_ptr_last) = ZCSG(map_ptr_last);
3662+
}
3663+
36433664
static int accel_preload(const char *config)
36443665
{
36453666
zend_file_handle file_handle;
@@ -3748,43 +3769,19 @@ static int accel_preload(const char *config)
37483769

37493770
ZEND_ASSERT(ZCSG(preload_script)->arena_size == 0);
37503771

3751-
/* Load into system heap */
3752-
if (zend_hash_num_elements(&ZCSG(preload_script)->script.function_table)) {
3753-
Bucket *p = ZCSG(preload_script)->script.function_table.arData;
3754-
Bucket *end = p + ZCSG(preload_script)->script.function_table.nNumUsed;
3755-
3756-
for (; p != end; p++) {
3757-
_zend_hash_append_ptr_ex(EG(function_table), p->key, Z_PTR(p->val), 1);
3758-
}
3759-
}
3760-
3761-
if (zend_hash_num_elements(&ZCSG(preload_script)->script.class_table)) {
3762-
Bucket *p = ZCSG(preload_script)->script.class_table.arData;
3763-
Bucket *end = p + ZCSG(preload_script)->script.class_table.nNumUsed;
3764-
3765-
for (; p != end; p++) {
3766-
_zend_hash_append_ptr_ex(EG(class_table), p->key, Z_PTR(p->val), 1);
3767-
}
3768-
}
3769-
3770-
EG(persistent_constants_count) = EG(zend_constants)->nNumUsed;
3771-
EG(persistent_functions_count) = EG(function_table)->nNumUsed;
3772-
EG(persistent_classes_count) = EG(class_table)->nNumUsed;
3772+
preload_load();
37733773

37743774
/* Store individual scripts with unlinked classes */
37753775
HANDLE_BLOCK_INTERRUPTIONS();
37763776
SHM_UNPROTECT();
37773777

37783778
i = 0;
3779-
zend_shared_alloc_lock();
37803779
ZCSG(saved_scripts) = zend_shared_alloc((zend_hash_num_elements(preload_scripts) + 1) * sizeof(void*));
3781-
zend_shared_alloc_unlock();
37823780
ZEND_HASH_FOREACH_PTR(preload_scripts, script) {
37833781
ZCSG(saved_scripts)[i++] = preload_script_in_shared_memory(script);
37843782
} ZEND_HASH_FOREACH_END();
37853783
ZCSG(saved_scripts)[i] = NULL;
37863784

3787-
CG(map_ptr_last) = ZCSG(map_ptr_last);
37883785
zend_shared_alloc_save_state();
37893786
accel_interned_strings_save_state();
37903787

@@ -3826,6 +3823,17 @@ static int accel_finish_startup(void)
38263823
return SUCCESS;
38273824
}
38283825

3826+
/* exclusive lock */
3827+
zend_shared_alloc_lock();
3828+
3829+
if (ZCSG(preload_script)) {
3830+
/* Preloading was done in another process */
3831+
preload_load();
3832+
preload_restart();
3833+
zend_shared_alloc_unlock();
3834+
return SUCCESS;
3835+
}
3836+
38293837
sapi_module.activate = NULL;
38303838
sapi_module.deactivate = NULL;
38313839
sapi_module.register_server_variables = NULL;
@@ -3877,6 +3885,8 @@ static int accel_finish_startup(void)
38773885
sapi_module.send_header = orig_send_header;
38783886
sapi_module.getenv = orig_getenv;
38793887

3888+
zend_shared_alloc_unlock();
3889+
38803890
sapi_activate();
38813891

38823892
return ret;

0 commit comments

Comments
 (0)