mirror of
https://github.com/php/php-src.git
synced 2025-08-18 15:08:55 +02:00
Don't waste SHM for unused Buckets
This commit is contained in:
parent
b5590a2f87
commit
3700364ca5
2 changed files with 21 additions and 8 deletions
|
@ -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;
|
||||
|
|
|
@ -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++) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue