]> granicus.if.org Git - php/commitdiff
Don't waste SHM for unused Buckets
authorDmitry Stogov <dmitry@zend.com>
Mon, 4 Aug 2014 18:51:41 +0000 (22:51 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 4 Aug 2014 18:51:41 +0000 (22:51 +0400)
ext/opcache/zend_persist.c
ext/opcache/zend_persist_calc.c

index e47cfda894229326a3dcaca63cc1cfbd0e9bf06c..69eecfd641381de78cd22cc74b709b55623e36a3 100644 (file)
@@ -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;
index b6740db04435f53bad778641124dac64a78c4289..0732cc2188af8a92cab26a37edce541b3313f822 100644 (file)
@@ -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++) {