From 3700364ca53b54fc26b9fa17bb98ad839541b51a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 4 Aug 2014 22:51:41 +0400 Subject: [PATCH] Don't waste SHM for unused Buckets --- ext/opcache/zend_persist.c | 25 +++++++++++++++++++------ ext/opcache/zend_persist_calc.c | 4 ++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index e47cfda894..69eecfd641 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 b6740db044..0732cc2188 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++) { -- 2.50.1