31
31
#include "zend_accelerator_blacklist.h"
32
32
#include "zend_list.h"
33
33
#include "zend_execute.h"
34
- #include "zend_ini_scanner.h"
35
34
#include "zend_inheritance.h"
36
35
#include "main/php_main.h"
37
36
#include "main/SAPI.h"
@@ -133,6 +132,11 @@ static void accel_gen_system_id(void);
133
132
static int accel_post_startup (void );
134
133
static int accel_finish_startup (void );
135
134
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
+
136
140
#ifdef ZEND_WIN32
137
141
# define INCREMENT (v ) InterlockedIncrement64(&ZCSG(v))
138
142
# define DECREMENT (v ) InterlockedDecrement64(&ZCSG(v))
@@ -564,30 +568,7 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int
564
568
HashTable * ht ;
565
569
566
570
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 ();
591
572
}
592
573
593
574
/* empty string */
@@ -1123,7 +1104,7 @@ static inline int do_validate_timestamps(zend_persistent_script *persistent_scri
1123
1104
int validate_timestamp_and_record (zend_persistent_script * persistent_script , zend_file_handle * file_handle )
1124
1105
{
1125
1106
if (persistent_script -> timestamp == 0 ) {
1126
- return SUCCESS ; // TODO: preloaded script ???
1107
+ return SUCCESS ; /* Don't check timestamps of preloaded scripts */
1127
1108
} else if (ZCG (accel_directives ).revalidate_freq &&
1128
1109
persistent_script -> dynamic_members .revalidate >= ZCG (request_time )) {
1129
1110
return SUCCESS ;
@@ -2425,15 +2406,7 @@ int accel_activate(INIT_FUNC_ARGS)
2425
2406
2426
2407
zend_shared_alloc_restore_state ();
2427
2408
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 ();
2437
2410
}
2438
2411
ZCSG (accelerator_enabled ) = ZCSG (cache_status_before_restart );
2439
2412
if (ZCSG (last_restart_time ) < ZCG (request_time )) {
@@ -2465,9 +2438,7 @@ int accel_activate(INIT_FUNC_ARGS)
2465
2438
}
2466
2439
2467
2440
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 ();
2471
2442
}
2472
2443
2473
2444
return SUCCESS ;
@@ -2484,6 +2455,10 @@ int accel_post_deactivate(void)
2484
2455
return SUCCESS ;
2485
2456
}
2486
2457
2458
+ if (ZCSG (preload_script )) {
2459
+ preload_deactivate ();
2460
+ }
2461
+
2487
2462
zend_shared_alloc_safe_unlock (); /* be sure we didn't leave cache locked */
2488
2463
accel_unlock_all ();
2489
2464
ZCG (counted ) = 0 ;
@@ -3082,7 +3057,104 @@ void accelerator_shm_read_unlock(void)
3082
3057
static HashTable * preload_scripts = NULL ;
3083
3058
static zend_op_array * (* preload_orig_compile_file )(zend_file_handle * file_handle , int type );
3084
3059
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 )
3086
3158
{
3087
3159
Bucket * p ;
3088
3160
dtor_func_t orig_dtor = src -> pDestructor ;
@@ -3102,7 +3174,7 @@ void preload_move_user_functions(HashTable *src, HashTable *dst)
3102
3174
src -> pDestructor = orig_dtor ;
3103
3175
}
3104
3176
3105
- void preload_move_user_classes (HashTable * src , HashTable * dst )
3177
+ static void preload_move_user_classes (HashTable * src , HashTable * dst )
3106
3178
{
3107
3179
Bucket * p ;
3108
3180
dtor_func_t orig_dtor = src -> pDestructor ;
0 commit comments