@@ -1346,6 +1346,25 @@ int zend_accel_invalidate(zend_string *filename, bool force)
1346
1346
return SUCCESS ;
1347
1347
}
1348
1348
1349
+ static zend_string * accel_new_interned_key (zend_string * key )
1350
+ {
1351
+ zend_string * new_key ;
1352
+
1353
+ GC_ADDREF (key );
1354
+ new_key = accel_new_interned_string (key );
1355
+ if (UNEXPECTED (new_key == key )) {
1356
+ new_key = zend_shared_alloc (ZEND_MM_ALIGNED_SIZE_EX (_ZSTR_STRUCT_SIZE (ZSTR_LEN (key )), 8 ));
1357
+ if (EXPECTED (new_key )) {
1358
+ GC_SET_REFCOUNT (new_key , 2 );
1359
+ GC_TYPE_INFO (new_key ) = GC_STRING | (IS_STR_INTERNED << GC_FLAGS_SHIFT );
1360
+ ZSTR_H (new_key ) = ZSTR_H (key );
1361
+ ZSTR_LEN (new_key ) = ZSTR_LEN (key );
1362
+ memcpy (ZSTR_VAL (new_key ), ZSTR_VAL (key ), ZSTR_LEN (new_key ) + 1 );
1363
+ }
1364
+ }
1365
+ return new_key ;
1366
+ }
1367
+
1349
1368
/* Adds another key for existing cached script */
1350
1369
static void zend_accel_add_key (zend_string * key , zend_accel_hash_entry * bucket )
1351
1370
{
@@ -1355,11 +1374,10 @@ static void zend_accel_add_key(zend_string *key, zend_accel_hash_entry *bucket)
1355
1374
ZSMMG (memory_exhausted ) = 1 ;
1356
1375
zend_accel_schedule_restart_if_necessary (ACCEL_RESTART_HASH );
1357
1376
} else {
1358
- char * new_key = zend_shared_alloc ( ZSTR_LEN ( key ) + 1 );
1377
+ zend_string * new_key = accel_new_interned_key ( key );
1359
1378
if (new_key ) {
1360
- memcpy (new_key , ZSTR_VAL (key ), ZSTR_LEN (key ) + 1 );
1361
- if (zend_accel_hash_update (& ZCSG (hash ), new_key , ZSTR_LEN (key ), 1 , bucket )) {
1362
- zend_accel_error (ACCEL_LOG_INFO , "Added key '%s'" , new_key );
1379
+ if (zend_accel_hash_update (& ZCSG (hash ), new_key , 1 , bucket )) {
1380
+ zend_accel_error (ACCEL_LOG_INFO , "Added key '%s'" , ZSTR_VAL (new_key ));
1363
1381
}
1364
1382
} else {
1365
1383
zend_accel_schedule_restart_if_necessary (ACCEL_RESTART_OOM );
@@ -1577,19 +1595,18 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
1577
1595
new_persistent_script -> dynamic_members .checksum = zend_accel_script_checksum (new_persistent_script );
1578
1596
1579
1597
/* store script structure in the hash table */
1580
- bucket = zend_accel_hash_update (& ZCSG (hash ), ZSTR_VAL ( new_persistent_script -> script .filename ), ZSTR_LEN ( new_persistent_script -> script . filename ) , 0 , new_persistent_script );
1598
+ bucket = zend_accel_hash_update (& ZCSG (hash ), new_persistent_script -> script .filename , 0 , new_persistent_script );
1581
1599
if (bucket ) {
1582
1600
zend_accel_error (ACCEL_LOG_INFO , "Cached script '%s'" , ZSTR_VAL (new_persistent_script -> script .filename ));
1583
1601
if (key &&
1584
1602
/* key may contain non-persistent PHAR aliases (see issues #115 and #149) */
1585
- memcmp (key , "phar://" , sizeof ("phar://" ) - 1 ) != 0 &&
1603
+ memcmp (ZSTR_VAL ( key ) , "phar://" , sizeof ("phar://" ) - 1 ) != 0 &&
1586
1604
!zend_string_equals (new_persistent_script -> script .filename , key )) {
1587
1605
/* link key to the same persistent script in hash table */
1588
- char * new_key = zend_shared_alloc ( ZSTR_LEN ( key ) + 1 );
1606
+ zend_string * new_key = accel_new_interned_key ( key );
1589
1607
1590
1608
if (new_key ) {
1591
- memcpy (new_key , ZSTR_VAL (key ), ZSTR_LEN (key ) + 1 );
1592
- if (zend_accel_hash_update (& ZCSG (hash ), new_key , ZSTR_LEN (key ), 1 , bucket )) {
1609
+ if (zend_accel_hash_update (& ZCSG (hash ), new_key , 1 , bucket )) {
1593
1610
zend_accel_error (ACCEL_LOG_INFO , "Added key '%s'" , ZSTR_VAL (key ));
1594
1611
} else {
1595
1612
zend_accel_error (ACCEL_LOG_DEBUG , "No more entries in hash table!" );
@@ -3528,11 +3545,11 @@ static void preload_activate(void)
3528
3545
3529
3546
static void preload_restart (void )
3530
3547
{
3531
- zend_accel_hash_update (& ZCSG (hash ), ZSTR_VAL ( ZCSG (preload_script )-> script .filename ), ZSTR_LEN ( ZCSG ( preload_script ) -> script . filename ) , 0 , ZCSG (preload_script ));
3548
+ zend_accel_hash_update (& ZCSG (hash ), ZCSG (preload_script )-> script .filename , 0 , ZCSG (preload_script ));
3532
3549
if (ZCSG (saved_scripts )) {
3533
3550
zend_persistent_script * * p = ZCSG (saved_scripts );
3534
3551
while (* p ) {
3535
- zend_accel_hash_update (& ZCSG (hash ), ZSTR_VAL (( * p )-> script .filename ), ZSTR_LEN (( * p ) -> script . filename ) , 0 , * p );
3552
+ zend_accel_hash_update (& ZCSG (hash ), ( * p )-> script .filename , 0 , * p );
3536
3553
p ++ ;
3537
3554
}
3538
3555
}
@@ -4472,7 +4489,7 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
4472
4489
new_persistent_script -> dynamic_members .checksum = zend_accel_script_checksum (new_persistent_script );
4473
4490
4474
4491
/* store script structure in the hash table */
4475
- bucket = zend_accel_hash_update (& ZCSG (hash ), ZSTR_VAL ( new_persistent_script -> script .filename ), ZSTR_LEN ( new_persistent_script -> script . filename ) , 0 , new_persistent_script );
4492
+ bucket = zend_accel_hash_update (& ZCSG (hash ), new_persistent_script -> script .filename , 0 , new_persistent_script );
4476
4493
if (bucket ) {
4477
4494
zend_accel_error (ACCEL_LOG_INFO , "Cached script '%s'" , ZSTR_VAL (new_persistent_script -> script .filename ));
4478
4495
}
0 commit comments