Skip to content

Commit d70cb10

Browse files
committed
cleanup
1 parent aabe685 commit d70cb10

File tree

2 files changed

+112
-84
lines changed

2 files changed

+112
-84
lines changed

Zend/zend_execute_API.c

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -340,57 +340,13 @@ void shutdown_executor(void) /* {{{ */
340340
destroy_op_array(&func->op_array);
341341
zend_string_release_ex(key, 0);
342342
} ZEND_HASH_FOREACH_END_DEL();
343-
344-
/* Cleanup preloaded immutable functions */
345-
ZEND_HASH_REVERSE_FOREACH_VAL(EG(function_table), zv) {
346-
zend_op_array *op_array = Z_PTR_P(zv);
347-
if (op_array->type == ZEND_INTERNAL_FUNCTION) {
348-
break;
349-
}
350-
ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_IMMUTABLE);
351-
if (op_array->static_variables) {
352-
HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr);
353-
if (ht) {
354-
ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
355-
zend_array_destroy(ht);
356-
}
357-
}
358-
} ZEND_HASH_FOREACH_END();
359-
360343
ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) {
361344
if (_idx == EG(persistent_classes_count)) {
362345
break;
363346
}
364347
destroy_zend_class(zv);
365348
zend_string_release_ex(key, 0);
366349
} ZEND_HASH_FOREACH_END_DEL();
367-
368-
/* Cleanup preloaded immutable classes */
369-
ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) {
370-
zend_class_entry *ce = Z_PTR_P(zv);
371-
if (ce->type == ZEND_INTERNAL_CLASS) {
372-
break;
373-
}
374-
ZEND_ASSERT(ce->ce_flags & ZEND_ACC_IMMUTABLE);
375-
if (ce->default_static_members_count) {
376-
zend_cleanup_internal_class_data(ce);
377-
}
378-
if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
379-
zend_op_array *op_array;
380-
381-
ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) {
382-
if (op_array->type == ZEND_USER_FUNCTION) {
383-
if (op_array->static_variables) {
384-
HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr);
385-
if (ht) {
386-
ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
387-
zend_array_destroy(ht);
388-
}
389-
}
390-
}
391-
} ZEND_HASH_FOREACH_END();
392-
}
393-
} ZEND_HASH_FOREACH_END();
394350
}
395351

396352
zend_cleanup_internal_classes();

ext/opcache/ZendAccelerator.c

Lines changed: 112 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
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);
133132
static int accel_post_startup(void);
134133
static 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
11231104
int 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)
30823057
static HashTable *preload_scripts = NULL;
30833058
static 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

Comments
 (0)