@@ -2388,32 +2388,14 @@ static bool user_cache_publish_prepared_shared_graph_locked(
23882388 );
23892389}
23902390
2391- static size_t user_cache_entry_storage_footprint_locked (const php_user_cache_entry * entry )
2392- {
2393- size_t footprint = 0 ;
2394-
2395- if (entry -> value_offset != 0 && user_cache_value_uses_offset (entry -> value_type )) {
2396- footprint += php_user_cache_block_payload_capacity (entry -> value_offset );
2397- }
2398-
2399- if (entry -> key_offset != 0 &&
2400- (entry -> reserved & PHP_USER_CACHE_ENTRY_RESERVED_COMBINED_VALUE_KEY ) == 0
2401- ) {
2402- footprint += php_user_cache_block_payload_capacity (entry -> key_offset );
2403- }
2404-
2405- return footprint ;
2406- }
2407-
2408- static bool user_cache_evict_lru_locked (size_t needed_size )
2391+ static bool user_cache_evict_lru_locked (size_t needed_size , size_t needed_key_size )
24092392{
24102393 php_user_cache_header * header = php_user_cache_header_ptr ();
24112394 php_user_cache_entry * entries , * entry ;
24122395 uint64_t lock_now , lock_now_rel ;
24132396 uint32_t hand , slot , scanned , collected , stamp , best_slot ,
24142397 best_stamp = 0 , victims = 0 , * stamps
24152398 ;
2416- size_t freed = 0 ;
24172399 int8_t graph_quiescent = -1 ;
24182400 bool evicted_any = false;
24192401
@@ -2425,7 +2407,6 @@ static bool user_cache_evict_lru_locked(size_t needed_size)
24252407 stamps = php_user_cache_access_stamps_ptr (header );
24262408 hand = header -> eviction_hand % header -> capacity ;
24272409 lock_now = (uint64_t ) time (NULL );
2428- /* The lock probe compares time_base-relative lease deadlines. */
24292410 lock_now_rel = php_user_cache_time_rel (header , lock_now );
24302411
24312412 user_cache_access_note_time (lock_now );
@@ -2455,9 +2436,6 @@ static bool user_cache_evict_lru_locked(size_t needed_size)
24552436 continue ;
24562437 }
24572438
2458- /* An undrained reader set would orphan the payload instead
2459- * of freeing it, so its bytes must not count toward freed;
2460- * probe lazily so graph-free scans never pay the drain wait. */
24612439 if (graph_quiescent < 0 ) {
24622440 graph_quiescent = php_user_cache_quiesce_graph_payloads_locked () ? 1 : 0 ;
24632441 }
@@ -2467,10 +2445,6 @@ static bool user_cache_evict_lru_locked(size_t needed_size)
24672445 }
24682446 }
24692447
2470- /* Both skips are load-bearing: evicting a per-key-locked entry
2471- * would break the writer serialization contract, and counting a
2472- * pinned graph payload as freed makes the retry fail into the
2473- * full-clear fallback. */
24742448 if (php_user_cache_entry_key_lock_active_locked (
24752449 header ,
24762450 entry -> hash ,
@@ -2496,15 +2470,16 @@ static bool user_cache_evict_lru_locked(size_t needed_size)
24962470 }
24972471
24982472 entry = & entries [best_slot ];
2499- freed += user_cache_entry_storage_footprint_locked (entry );
25002473
25012474 user_cache_delete_entry_locked (header , entry );
25022475
25032476 header -> eviction_count ++ ;
25042477 victims ++ ;
25052478 evicted_any = true;
25062479
2507- if (needed_size == 0 || freed >= needed_size ) {
2480+ if (needed_size == 0 ||
2481+ php_user_cache_alloc_can_satisfy_locked (needed_size , needed_key_size )
2482+ ) {
25082483 break ;
25092484 }
25102485 }
@@ -2517,6 +2492,7 @@ static bool user_cache_evict_lru_locked(size_t needed_size)
25172492static bool user_cache_reclaim_space_for_store_locked (
25182493 bool can_reclaim ,
25192494 size_t needed_size ,
2495+ size_t needed_key_size ,
25202496 bool * expired_retry_used ,
25212497 bool * evict_retry_used ,
25222498 bool * clear_retry_used )
@@ -2545,7 +2521,7 @@ static bool user_cache_reclaim_space_for_store_locked(
25452521 ) {
25462522 * evict_retry_used = true;
25472523
2548- if (user_cache_evict_lru_locked (needed_size )) {
2524+ if (user_cache_evict_lru_locked (needed_size , needed_key_size )) {
25492525 return true;
25502526 }
25512527 }
@@ -2622,6 +2598,7 @@ static php_user_cache_store_attempt_result user_cache_store_attempt_locked(
26222598 user_cache_reclaim_space_for_store_locked (
26232599 true,
26242600 0 ,
2601+ 0 ,
26252602 expired_retry_used ,
26262603 evict_retry_used ,
26272604 clear_retry_used
@@ -2833,6 +2810,7 @@ static php_user_cache_store_attempt_result user_cache_store_attempt_locked(
28332810 user_cache_reclaim_space_for_store_locked (
28342811 true,
28352812 prepared -> payload_size + key_size ,
2813+ 0 ,
28362814 expired_retry_used ,
28372815 evict_retry_used ,
28382816 clear_retry_used
@@ -2878,6 +2856,7 @@ static php_user_cache_store_attempt_result user_cache_store_attempt_locked(
28782856 user_cache_reclaim_space_for_store_locked (
28792857 true ,
28802858 prepared - > payload_size ,
2859+ 0 ,
28812860 expired_retry_used ,
28822861 evict_retry_used ,
28832862 clear_retry_used
@@ -2969,7 +2948,14 @@ static php_user_cache_store_attempt_result user_cache_store_attempt_locked(
29692948 if (options -> retry_after_memory_pressure &&
29702949 user_cache_reclaim_space_for_store_locked (
29712950 can_reclaim ,
2972- prepared -> payload_size + key_size ,
2951+ use_combined_publish
2952+ ? prepared -> payload_size + key_size
2953+ : prepared -> payload_size
2954+ ,
2955+ use_combined_publish
2956+ ? 0
2957+ : key_size
2958+ ,
29732959 expired_retry_used ,
29742960 evict_retry_used ,
29752961 clear_retry_used
0 commit comments