diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-07-17 17:31:04 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-07-17 17:31:04 +0300 |
commit | 3b6e1ee4ee05678b5d717cd926a35ffdc1335929 (patch) | |
tree | 32814be67889faee2edcdfe0ee6a0a527318dc38 /Zend | |
parent | 7db988cc30c16de8fdf4d07ee61df2fe54e783aa (diff) | |
download | php-git-3b6e1ee4ee05678b5d717cd926a35ffdc1335929.tar.gz |
Improved "Fast Shutdown".
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend_execute_API.c | 26 | ||||
-rw-r--r-- | Zend/zend_globals.h | 4 | ||||
-rw-r--r-- | Zend/zend_hash.c | 17 | ||||
-rw-r--r-- | Zend/zend_hash.h | 1 |
4 files changed, 29 insertions, 19 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index d08b77a520..9f537fda10 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -181,6 +181,10 @@ void init_executor(void) /* {{{ */ EG(each_deprecation_thrown) = 0; + EG(persisent_constants_count) = EG(zend_constants)->nNumUsed; + EG(persistent_functions_count) = EG(function_table)->nNumUsed; + EG(persistent_classes_count) = EG(class_table)->nNumUsed; + EG(active) = 1; } /* }}} */ @@ -279,25 +283,9 @@ void shutdown_executor(void) /* {{{ */ * Zend Memory Manager frees memory by its own. We don't have to free * each allocated block separately. */ - ZEND_HASH_REVERSE_FOREACH_VAL(EG(zend_constants), zv) { - zend_constant *c = Z_PTR_P(zv); - if (c->flags & CONST_PERSISTENT) { - break; - } - } ZEND_HASH_FOREACH_END_DEL(); - ZEND_HASH_REVERSE_FOREACH_VAL(EG(function_table), zv) { - zend_function *func = Z_PTR_P(zv); - if (func->type == ZEND_INTERNAL_FUNCTION) { - break; - } - } ZEND_HASH_FOREACH_END_DEL(); - ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) { - zend_class_entry *ce = Z_PTR_P(zv); - if (ce->type == ZEND_INTERNAL_CLASS) { - break; - } - } ZEND_HASH_FOREACH_END_DEL(); - + zend_hash_discard(EG(zend_constants), EG(persisent_constants_count)); + zend_hash_discard(EG(function_table), EG(persistent_functions_count)); + zend_hash_discard(EG(class_table), EG(persistent_classes_count)); zend_cleanup_internal_classes(); } else { zend_hash_graceful_reverse_destroy(&EG(symbol_table)); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 01b5583f0a..eec1f24883 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -164,6 +164,10 @@ struct _zend_executor_globals { int ticks_count; + uint32_t persisent_constants_count; + uint32_t persistent_functions_count; + uint32_t persistent_classes_count; + HashTable *in_autoload; zend_function *autoload_func; zend_bool full_tables_cleanup; diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 2de46b4f99..b4a62b1649 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -327,6 +327,23 @@ ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend } } +ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed) +{ + uint32_t idx; + Bucket *p; + uint32_t nIndex; + + for (idx = ht->nNumUsed, p = ht->arData + idx; idx > nNumUsed; idx--) { + p--; + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + ht->nNumOfElements--; + /* Collision pointers always directed from higher to lower buckets */ + nIndex = p->h | ht->nTableMask; + HT_HASH(ht, nIndex) = Z_NEXT(p->val); + } + ht->nNumUsed = idx; +} + static uint32_t zend_array_recalc_elements(HashTable *ht) { zval *val; diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index c65c849dda..984730e5fd 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -104,6 +104,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht); ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht); ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht); ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend_bool packed); +ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed); /* additions/updates/changes */ ZEND_API zval* ZEND_FASTCALL _zend_hash_add_or_update(HashTable *ht, zend_string *key, zval *pData, uint32_t flag ZEND_FILE_LINE_DC); |