Merge branch 'PHP-5.5'

* PHP-5.5:
  Compact HashTables before storing them in shared memory

Conflicts:
	ext/opcache/ZendAccelerator.c
This commit is contained in:
Dmitry Stogov 2013-06-10 11:25:41 +04:00
commit 456ef2ebfa
3 changed files with 52 additions and 0 deletions

View File

@ -1130,6 +1130,10 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
return new_persistent_script;
}
if (!compact_persistent_script(new_persistent_script)) {
return new_persistent_script;
}
/* exclusive lock */
zend_shared_alloc_lock(TSRMLS_C);

View File

@ -86,6 +86,53 @@ zend_persistent_script* create_persistent_script(void)
return persistent_script;
}
static int compact_hash_table(HashTable *ht)
{
uint i = 3;
uint nSize;
Bucket **t;
if (!ht->nNumOfElements) {
/* Empty tables don't allocate space for Buckets */
return 1;
}
if (ht->nNumOfElements >= 0x80000000) {
/* prevent overflow */
nSize = 0x80000000;
} else {
while ((1U << i) < ht->nNumOfElements) {
i++;
}
nSize = 1 << i;
}
if (nSize >= ht->nTableSize) {
/* Keep the size */
return 1;
}
t = (Bucket **)pemalloc(nSize * sizeof(Bucket *), ht->persistent);
if (!t) {
return 0;
}
pefree(ht->arBuckets, ht->persistent);
ht->arBuckets = t;
ht->nTableSize = nSize;
ht->nTableMask = ht->nTableSize - 1;
zend_hash_rehash(ht);
return 1;
}
int compact_persistent_script(zend_persistent_script *persistent_script)
{
return compact_hash_table(&persistent_script->function_table) &&
compact_hash_table(&persistent_script->class_table);
}
void free_persistent_script(zend_persistent_script *persistent_script, int destroy_elements)
{
if (destroy_elements) {

View File

@ -28,6 +28,7 @@
void zend_accel_copy_internal_functions(TSRMLS_D);
zend_persistent_script* create_persistent_script(void);
int compact_persistent_script(zend_persistent_script *script);
void free_persistent_script(zend_persistent_script *persistent_script, int destroy_elements);
void zend_accel_free_user_functions(HashTable *ht TSRMLS_DC);