@@ -3545,11 +3545,7 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
3545
3545
uint32_t memory_used ;
3546
3546
uint32_t checkpoint ;
3547
3547
3548
- /* exclusive lock */
3549
- zend_shared_alloc_lock ();
3550
-
3551
3548
if (zend_accel_hash_is_full (& ZCSG (hash ))) {
3552
- zend_shared_alloc_unlock ();
3553
3549
zend_accel_error (ACCEL_LOG_FATAL , "Not enough entries in hash table for preloading!" );
3554
3550
return NULL ;
3555
3551
}
@@ -3602,7 +3598,6 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
3602
3598
}
3603
3599
#endif
3604
3600
if (!ZCG (mem )) {
3605
- zend_shared_alloc_unlock ();
3606
3601
zend_accel_error (ACCEL_LOG_FATAL , "Not enough shared memory for preloading!" );
3607
3602
return NULL ;
3608
3603
}
@@ -3635,11 +3630,37 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
3635
3630
3636
3631
new_persistent_script -> dynamic_members .memory_consumption = ZEND_ALIGNED_SIZE (new_persistent_script -> size );
3637
3632
3638
- zend_shared_alloc_unlock ();
3639
-
3640
3633
return new_persistent_script ;
3641
3634
}
3642
3635
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
+
3643
3664
static int accel_preload (const char * config )
3644
3665
{
3645
3666
zend_file_handle file_handle ;
@@ -3748,43 +3769,19 @@ static int accel_preload(const char *config)
3748
3769
3749
3770
ZEND_ASSERT (ZCSG (preload_script )-> arena_size == 0 );
3750
3771
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 ();
3773
3773
3774
3774
/* Store individual scripts with unlinked classes */
3775
3775
HANDLE_BLOCK_INTERRUPTIONS ();
3776
3776
SHM_UNPROTECT ();
3777
3777
3778
3778
i = 0 ;
3779
- zend_shared_alloc_lock ();
3780
3779
ZCSG (saved_scripts ) = zend_shared_alloc ((zend_hash_num_elements (preload_scripts ) + 1 ) * sizeof (void * ));
3781
- zend_shared_alloc_unlock ();
3782
3780
ZEND_HASH_FOREACH_PTR (preload_scripts , script ) {
3783
3781
ZCSG (saved_scripts )[i ++ ] = preload_script_in_shared_memory (script );
3784
3782
} ZEND_HASH_FOREACH_END ();
3785
3783
ZCSG (saved_scripts )[i ] = NULL ;
3786
3784
3787
- CG (map_ptr_last ) = ZCSG (map_ptr_last );
3788
3785
zend_shared_alloc_save_state ();
3789
3786
accel_interned_strings_save_state ();
3790
3787
@@ -3826,6 +3823,17 @@ static int accel_finish_startup(void)
3826
3823
return SUCCESS ;
3827
3824
}
3828
3825
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
+
3829
3837
sapi_module .activate = NULL ;
3830
3838
sapi_module .deactivate = NULL ;
3831
3839
sapi_module .register_server_variables = NULL ;
@@ -3877,6 +3885,8 @@ static int accel_finish_startup(void)
3877
3885
sapi_module .send_header = orig_send_header ;
3878
3886
sapi_module .getenv = orig_getenv ;
3879
3887
3888
+ zend_shared_alloc_unlock ();
3889
+
3880
3890
sapi_activate ();
3881
3891
3882
3892
return ret ;
0 commit comments