summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-07-17 17:31:04 +0300
committerDmitry Stogov <dmitry@zend.com>2018-07-17 17:31:04 +0300
commit3b6e1ee4ee05678b5d717cd926a35ffdc1335929 (patch)
tree32814be67889faee2edcdfe0ee6a0a527318dc38 /Zend
parent7db988cc30c16de8fdf4d07ee61df2fe54e783aa (diff)
downloadphp-git-3b6e1ee4ee05678b5d717cd926a35ffdc1335929.tar.gz
Improved "Fast Shutdown".
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_execute_API.c26
-rw-r--r--Zend/zend_globals.h4
-rw-r--r--Zend/zend_hash.c17
-rw-r--r--Zend/zend_hash.h1
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);