3131#include "zend_accelerator_blacklist.h"
3232#include "zend_list.h"
3333#include "zend_execute.h"
34- #include "zend_ini_scanner.h"
3534#include "zend_inheritance.h"
3635#include "main/php_main.h"
3736#include "main/SAPI.h"
@@ -133,6 +132,11 @@ static void accel_gen_system_id(void);
133132static int accel_post_startup (void );
134133static int accel_finish_startup (void );
135134
135+ static void preload_shutdown (void );
136+ static void preload_activate (void );
137+ static void preload_deactivate (void );
138+ static void preload_restart (void );
139+
136140#ifdef ZEND_WIN32
137141# define INCREMENT (v ) InterlockedIncrement64(&ZCSG(v))
138142# define DECREMENT (v ) InterlockedDecrement64(&ZCSG(v))
@@ -564,30 +568,7 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int
564568 HashTable * ht ;
565569
566570 if (ZCSG (preload_script )) {
567- zval * zv ;
568-
569- #if 0
570- ZEND_HASH_REVERSE_FOREACH_VAL (EG (zend_constants ), zv ) {
571- zend_constant * c = Z_PTR_P (zv );
572- if (ZEND_CONSTANT_FLAGS (c ) & CONST_PERSISTENT ) {
573- break ;
574- }
575- } ZEND_HASH_FOREACH_END_DEL ();
576- #endif
577-
578- ZEND_HASH_REVERSE_FOREACH_VAL (EG (function_table ), zv ) {
579- zend_function * func = Z_PTR_P (zv );
580- if (func -> type == ZEND_INTERNAL_FUNCTION ) {
581- break ;
582- }
583- } ZEND_HASH_FOREACH_END_DEL ();
584-
585- ZEND_HASH_REVERSE_FOREACH_VAL (EG (class_table ), zv ) {
586- zend_class_entry * ce = Z_PTR_P (zv );
587- if (ce -> type == ZEND_INTERNAL_CLASS ) {
588- break ;
589- }
590- } ZEND_HASH_FOREACH_END_DEL ();
571+ preload_shutdown ();
591572 }
592573
593574 /* empty string */
@@ -1123,7 +1104,7 @@ static inline int do_validate_timestamps(zend_persistent_script *persistent_scri
11231104int validate_timestamp_and_record (zend_persistent_script * persistent_script , zend_file_handle * file_handle )
11241105{
11251106 if (persistent_script -> timestamp == 0 ) {
1126- return SUCCESS ; // TODO: preloaded script ???
1107+ return SUCCESS ; /* Don't check timestamps of preloaded scripts */
11271108 } else if (ZCG (accel_directives ).revalidate_freq &&
11281109 persistent_script -> dynamic_members .revalidate >= ZCG (request_time )) {
11291110 return SUCCESS ;
@@ -2425,15 +2406,7 @@ int accel_activate(INIT_FUNC_ARGS)
24252406
24262407 zend_shared_alloc_restore_state ();
24272408 if (ZCSG (preload_script )) {
2428- zend_accel_hash_update (& ZCSG (hash ), ZSTR_VAL (ZCSG (preload_script )-> script .filename ), ZSTR_LEN (ZCSG (preload_script )-> script .filename ), 0 , ZCSG (preload_script ));
2429- if (ZCSG (saved_scripts )) {
2430- zend_persistent_script * * p = ZCSG (saved_scripts );
2431- while (* p ) {
2432- zend_accel_hash_update (& ZCSG (hash ), ZSTR_VAL ((* p )-> script .filename ), ZSTR_LEN ((* p )-> script .filename ), 0 , * p );
2433- p ++ ;
2434- }
2435- }
2436- ZCSG (map_ptr_last ) = ZCSG (saved_map_ptr_last );
2409+ preload_restart ();
24372410 }
24382411 ZCSG (accelerator_enabled ) = ZCSG (cache_status_before_restart );
24392412 if (ZCSG (last_restart_time ) < ZCG (request_time )) {
@@ -2465,9 +2438,7 @@ int accel_activate(INIT_FUNC_ARGS)
24652438 }
24662439
24672440 if (ZCSG (preload_script )) {
2468- if (ZCSG (preload_script )-> ping_auto_globals_mask ) {
2469- zend_accel_set_auto_globals (ZCSG (preload_script )-> ping_auto_globals_mask );
2470- }
2441+ preload_activate ();
24712442 }
24722443
24732444 return SUCCESS ;
@@ -2484,6 +2455,10 @@ int accel_post_deactivate(void)
24842455 return SUCCESS ;
24852456 }
24862457
2458+ if (ZCSG (preload_script )) {
2459+ preload_deactivate ();
2460+ }
2461+
24872462 zend_shared_alloc_safe_unlock (); /* be sure we didn't leave cache locked */
24882463 accel_unlock_all ();
24892464 ZCG (counted ) = 0 ;
@@ -3082,7 +3057,104 @@ void accelerator_shm_read_unlock(void)
30823057static HashTable * preload_scripts = NULL ;
30833058static zend_op_array * (* preload_orig_compile_file )(zend_file_handle * file_handle , int type );
30843059
3085- void preload_move_user_functions (HashTable * src , HashTable * dst )
3060+ static void preload_shutdown (void )
3061+ {
3062+ zval * zv ;
3063+
3064+ #if 0
3065+ ZEND_HASH_REVERSE_FOREACH_VAL (EG (zend_constants ), zv ) {
3066+ zend_constant * c = Z_PTR_P (zv );
3067+ if (ZEND_CONSTANT_FLAGS (c ) & CONST_PERSISTENT ) {
3068+ break ;
3069+ }
3070+ } ZEND_HASH_FOREACH_END_DEL ();
3071+ #endif
3072+
3073+ ZEND_HASH_REVERSE_FOREACH_VAL (EG (function_table ), zv ) {
3074+ zend_function * func = Z_PTR_P (zv );
3075+ if (func -> type == ZEND_INTERNAL_FUNCTION ) {
3076+ break ;
3077+ }
3078+ } ZEND_HASH_FOREACH_END_DEL ();
3079+
3080+ ZEND_HASH_REVERSE_FOREACH_VAL (EG (class_table ), zv ) {
3081+ zend_class_entry * ce = Z_PTR_P (zv );
3082+ if (ce -> type == ZEND_INTERNAL_CLASS ) {
3083+ break ;
3084+ }
3085+ } ZEND_HASH_FOREACH_END_DEL ();
3086+ }
3087+
3088+ static void preload_activate (void )
3089+ {
3090+ if (ZCSG (preload_script )-> ping_auto_globals_mask ) {
3091+ zend_accel_set_auto_globals (ZCSG (preload_script )-> ping_auto_globals_mask );
3092+ }
3093+ }
3094+
3095+ static void preload_deactivate (void )
3096+ {
3097+ if ((ZEND_DEBUG || !is_zend_mm ()) && !EG (full_tables_cleanup )) {
3098+ zval * zv ;
3099+
3100+ /* Cleanup preloaded immutable functions */
3101+ ZEND_HASH_REVERSE_FOREACH_VAL (EG (function_table ), zv ) {
3102+ zend_op_array * op_array = Z_PTR_P (zv );
3103+ if (op_array -> type == ZEND_INTERNAL_FUNCTION ) {
3104+ break ;
3105+ }
3106+ ZEND_ASSERT (op_array -> fn_flags & ZEND_ACC_IMMUTABLE );
3107+ if (op_array -> static_variables ) {
3108+ HashTable * ht = ZEND_MAP_PTR_GET (op_array -> static_variables_ptr );
3109+ if (ht ) {
3110+ ZEND_ASSERT (GC_REFCOUNT (ht ) == 1 );
3111+ zend_array_destroy (ht );
3112+ }
3113+ }
3114+ } ZEND_HASH_FOREACH_END ();
3115+
3116+ /* Cleanup preloaded immutable classes */
3117+ ZEND_HASH_REVERSE_FOREACH_VAL (EG (class_table ), zv ) {
3118+ zend_class_entry * ce = Z_PTR_P (zv );
3119+ if (ce -> type == ZEND_INTERNAL_CLASS ) {
3120+ break ;
3121+ }
3122+ ZEND_ASSERT (ce -> ce_flags & ZEND_ACC_IMMUTABLE );
3123+ if (ce -> default_static_members_count ) {
3124+ zend_cleanup_internal_class_data (ce );
3125+ }
3126+ if (ce -> ce_flags & ZEND_HAS_STATIC_IN_METHODS ) {
3127+ zend_op_array * op_array ;
3128+ ZEND_HASH_FOREACH_PTR (& ce -> function_table , op_array ) {
3129+ if (op_array -> type == ZEND_USER_FUNCTION ) {
3130+ if (op_array -> static_variables ) {
3131+ HashTable * ht = ZEND_MAP_PTR_GET (op_array -> static_variables_ptr );
3132+ if (ht ) {
3133+ ZEND_ASSERT (GC_REFCOUNT (ht ) == 1 );
3134+ zend_array_destroy (ht );
3135+ }
3136+ }
3137+ }
3138+ } ZEND_HASH_FOREACH_END ();
3139+ }
3140+ } ZEND_HASH_FOREACH_END ();
3141+ }
3142+ }
3143+
3144+ static void preload_restart (void )
3145+ {
3146+ zend_accel_hash_update (& ZCSG (hash ), ZSTR_VAL (ZCSG (preload_script )-> script .filename ), ZSTR_LEN (ZCSG (preload_script )-> script .filename ), 0 , ZCSG (preload_script ));
3147+ if (ZCSG (saved_scripts )) {
3148+ zend_persistent_script * * p = ZCSG (saved_scripts );
3149+ while (* p ) {
3150+ zend_accel_hash_update (& ZCSG (hash ), ZSTR_VAL ((* p )-> script .filename ), ZSTR_LEN ((* p )-> script .filename ), 0 , * p );
3151+ p ++ ;
3152+ }
3153+ }
3154+ ZCSG (map_ptr_last ) = ZCSG (saved_map_ptr_last );
3155+ }
3156+
3157+ static void preload_move_user_functions (HashTable * src , HashTable * dst )
30863158{
30873159 Bucket * p ;
30883160 dtor_func_t orig_dtor = src -> pDestructor ;
@@ -3102,7 +3174,7 @@ void preload_move_user_functions(HashTable *src, HashTable *dst)
31023174 src -> pDestructor = orig_dtor ;
31033175}
31043176
3105- void preload_move_user_classes (HashTable * src , HashTable * dst )
3177+ static void preload_move_user_classes (HashTable * src , HashTable * dst )
31063178{
31073179 Bucket * p ;
31083180 dtor_func_t orig_dtor = src -> pDestructor ;
0 commit comments