mirror of
https://github.com/php/php-src.git
synced 2026-03-27 09:42:22 +01:00
Reduce number of hash collisions during dulicate address detection.
This commit is contained in:
@@ -337,8 +337,10 @@ void *zend_shared_alloc(size_t size)
|
||||
int zend_shared_memdup_size(void *source, size_t size)
|
||||
{
|
||||
void *old_p;
|
||||
zend_ulong key = (zend_ulong)source;
|
||||
|
||||
if ((old_p = zend_hash_index_find_ptr(&ZCG(xlat_table), (zend_ulong)source)) != NULL) {
|
||||
key = (key >> 3) | (key << ((sizeof(key) * 8) - 3)); /* key = _rotr(key, 3);*/
|
||||
if ((old_p = zend_hash_index_find_ptr(&ZCG(xlat_table), key)) != NULL) {
|
||||
/* we already duplicated this pointer */
|
||||
return 0;
|
||||
}
|
||||
@@ -349,8 +351,10 @@ int zend_shared_memdup_size(void *source, size_t size)
|
||||
void *_zend_shared_memdup(void *source, size_t size, zend_bool free_source)
|
||||
{
|
||||
void *old_p, *retval;
|
||||
zend_ulong key = (zend_ulong)source;
|
||||
|
||||
if ((old_p = zend_hash_index_find_ptr(&ZCG(xlat_table), (zend_ulong)source)) != NULL) {
|
||||
key = (key >> 3) | (key << ((sizeof(key) * 8) - 3)); /* key = _rotr(key, 3);*/
|
||||
if ((old_p = zend_hash_index_find_ptr(&ZCG(xlat_table), key)) != NULL) {
|
||||
/* we already duplicated this pointer */
|
||||
return old_p;
|
||||
}
|
||||
@@ -443,14 +447,19 @@ void zend_shared_alloc_clear_xlat_table(void)
|
||||
|
||||
void zend_shared_alloc_register_xlat_entry(const void *old, const void *new)
|
||||
{
|
||||
zend_hash_index_add_new_ptr(&ZCG(xlat_table), (zend_ulong)old, (void*)new);
|
||||
zend_ulong key = (zend_ulong)old;
|
||||
|
||||
key = (key >> 3) | (key << ((sizeof(key) * 8) - 3)); /* key = _rotr(key, 3);*/
|
||||
zend_hash_index_add_new_ptr(&ZCG(xlat_table), key, (void*)new);
|
||||
}
|
||||
|
||||
void *zend_shared_alloc_get_xlat_entry(const void *old)
|
||||
{
|
||||
void *retval;
|
||||
zend_ulong key = (zend_ulong)old;
|
||||
|
||||
if ((retval = zend_hash_index_find_ptr(&ZCG(xlat_table), (zend_ulong)old)) == NULL) {
|
||||
key = (key >> 3) | (key << ((sizeof(key) * 8) - 3)); /* key = _rotr(key, 3);*/
|
||||
if ((retval = zend_hash_index_find_ptr(&ZCG(xlat_table), key)) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
return retval;
|
||||
|
||||
Reference in New Issue
Block a user