com php-src: Don't waste SHM for unused Buckets: ext/opcache/ze nd_persist.c ext/opcache/zend_persist_calc.c
| From: | Dmitry Stogov | Date: | Mon, 04 Aug 2014 18:51:41 +0000 |
| Subject: | com php-src: Don't waste SHM for unused Buckets: ext/opcache/ze nd_persist.c ext/opcache/zend_persist_calc.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-79729@lists.php.net to get a copy of this message | ||
Commit: 3700364ca53b54fc26b9fa17bb98ad839541b51a
Author: Dmitry Stogov <dmitry@zend.com> Mon, 4 Aug 2014 22:51:41 +0400
Parents: b5590a2f874f7370c16619eb87bb89268aa7fe03
Branches: phpng
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=3700364ca53b54fc26b9fa17bb98ad839541b51a
Log:
Don't waste SHM for unused Buckets
Changed paths:
M ext/opcache/zend_persist.c
M ext/opcache/zend_persist_calc.c
Diff:
diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c
index e47cfda..69eecfd 100644
--- a/ext/opcache/zend_persist.c
+++ b/ext/opcache/zend_persist.c
@@ -86,11 +86,18 @@ static void zend_hash_persist(HashTable *ht, zend_persist_func_t pPersistElement
return;
}
if (ht->u.flags & HASH_FLAG_PACKED) {
- zend_accel_store(ht->arData, sizeof(Bucket) * ht->nTableSize);
+ zend_accel_store(ht->arData, sizeof(Bucket) * ht->nNumUsed);
ht->arHash = (zend_uint*)&uninitialized_bucket;
} else {
- zend_accel_store(ht->arData, (sizeof(Bucket) + sizeof(zend_uint)) * ht->nTableSize);
- ht->arHash = (zend_uint*)(ht->arData + ht->nTableSize);
+ Bucket *d = (Bucket*)ZCG(mem);
+ zend_uint *h = (zend_uint*)(d + ht->nNumUsed);
+
+ ZCG(mem) = (void*)(h + ht->nTableSize);
+ memcpy(d, ht->arData, sizeof(Bucket) * ht->nNumUsed);
+ memcpy(h, ht->arHash, sizeof(zend_uint) * ht->nTableSize);
+ efree(ht->arData);
+ ht->arData = d;
+ ht->arHash = h;
}
for (idx = 0; idx < ht->nNumUsed; idx++) {
p = ht->arData + idx;
@@ -116,11 +123,17 @@ static void zend_hash_persist_immutable(HashTable *ht TSRMLS_DC)
return;
}
if (ht->u.flags & HASH_FLAG_PACKED) {
- ht->arData = zend_accel_memdup(ht->arData, sizeof(Bucket) * ht->nTableSize);
+ ht->arData = zend_accel_memdup(ht->arData, sizeof(Bucket) * ht->nNumUsed);
ht->arHash = (zend_uint*)&uninitialized_bucket;
} else {
- ht->arData = zend_accel_memdup(ht->arData, (sizeof(Bucket) + sizeof(zend_uint)) *
ht->nTableSize);
- ht->arHash = (zend_uint*)(ht->arData + ht->nTableSize);
+ Bucket *d = (Bucket*)ZCG(mem);
+ zend_uint *h = (zend_uint*)(d + ht->nNumUsed);
+
+ ZCG(mem) = (void*)(h + ht->nTableSize);
+ memcpy(d, ht->arData, sizeof(Bucket) * ht->nNumUsed);
+ memcpy(h, ht->arHash, sizeof(zend_uint) * ht->nTableSize);
+ ht->arData = d;
+ ht->arHash = h;
}
for (idx = 0; idx < ht->nNumUsed; idx++) {
p = ht->arData + idx;
diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c
index b6740db...0732cc2 100644
--- a/ext/opcache/zend_persist_calc.c
+++ b/ext/opcache/zend_persist_calc.c
@@ -63,9 +63,9 @@ static uint zend_hash_persist_calc(HashTable *ht, uint (*pPersistElement)(zval *
RETURN_SIZE();
}
if (ht->u.flags & HASH_FLAG_PACKED) {
- ADD_DUP_SIZE(ht->arData, sizeof(Bucket) * ht->nTableSize);
+ ADD_SIZE(sizeof(Bucket) * ht->nNumUsed);
} else {
- ADD_DUP_SIZE(ht->arData, (sizeof(Bucket) + sizeof(zend_uint)) * ht->nTableSize);
+ ADD_SIZE(sizeof(Bucket) * ht->nNumUsed + sizeof(zend_uint) * ht->nTableSize);
}
for (idx = 0; idx < ht->nNumUsed; idx++) {