@@ -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+
36433664static 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