@@ -1671,7 +1671,10 @@ static zend_never_inline void *zend_mm_realloc_huge(zend_mm_heap *heap, void *pt
16711671 return zend_mm_realloc_slow (heap , ptr , size , MIN (old_size , copy_size ) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
16721672}
16731673
1674- static zend_always_inline void * zend_mm_realloc_heap (zend_mm_heap * heap , void * ptr , size_t size , bool use_copy_size , size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
1674+ #define EREALLOC_DEFAULT 0
1675+ #define EREALLOC_COPY 1
1676+ #define EREALLOC_NOSHRINK 2
1677+ static zend_always_inline void * zend_mm_realloc_heap (zend_mm_heap * heap , void * ptr , size_t size , int mode , size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
16751678{
16761679 size_t page_offset ;
16771680 size_t old_size ;
@@ -1686,6 +1689,12 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
16861689 if (EXPECTED (ptr == NULL )) {
16871690 return _zend_mm_alloc (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
16881691 } else {
1692+ if (mode == EREALLOC_NOSHRINK ) {
1693+ old_size = zend_mm_get_huge_block_size (heap , ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
1694+ if (EXPECTED (size <= old_size )) {
1695+ return ptr ;
1696+ }
1697+ }
16891698 return zend_mm_realloc_huge (heap , ptr , size , copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
16901699 }
16911700 } else {
@@ -1713,10 +1722,10 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
17131722 /* Check if requested size fits into current bin */
17141723 if (size <= old_size ) {
17151724 /* Check if truncation is necessary */
1716- if (old_bin_num > 0 && size < bin_data_size [old_bin_num - 1 ]) {
1725+ if (mode != EREALLOC_NOSHRINK && old_bin_num > 0 && size < bin_data_size [old_bin_num - 1 ]) {
17171726 /* truncation */
17181727 ret = zend_mm_alloc_small (heap , ZEND_MM_SMALL_SIZE_TO_BIN (size ) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
1719- copy_size = use_copy_size ? MIN (size , copy_size ) : size ;
1728+ copy_size = mode != EREALLOC_DEFAULT ? MIN (size , copy_size ) : size ;
17201729 memcpy (ret , ptr , copy_size );
17211730 zend_mm_free_small (heap , ptr , old_bin_num );
17221731 } else {
@@ -1731,7 +1740,7 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
17311740 size_t orig_peak = heap -> peak ;
17321741#endif
17331742 ret = zend_mm_alloc_small (heap , ZEND_MM_SMALL_SIZE_TO_BIN (size ) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
1734- copy_size = use_copy_size ? MIN (old_size , copy_size ) : old_size ;
1743+ copy_size = mode != EREALLOC_DEFAULT ? MIN (old_size , copy_size ) : old_size ;
17351744 memcpy (ret , ptr , copy_size );
17361745 zend_mm_free_small (heap , ptr , old_bin_num );
17371746#if ZEND_MM_STAT
@@ -1759,7 +1768,7 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
17591768 old_size = ZEND_MM_LRUN_PAGES (info ) * ZEND_MM_PAGE_SIZE ;
17601769 if (size > ZEND_MM_MAX_SMALL_SIZE && size <= ZEND_MM_MAX_LARGE_SIZE ) {
17611770 new_size = ZEND_MM_ALIGNED_SIZE_EX (size , ZEND_MM_PAGE_SIZE );
1762- if (new_size == old_size ) {
1771+ if (mode == EREALLOC_NOSHRINK ? new_size <= old_size : ( new_size == old_size ) ) {
17631772#if ZEND_DEBUG
17641773 dbg = zend_mm_get_debug_info (heap , ptr );
17651774 dbg -> size = real_size ;
@@ -2579,12 +2588,17 @@ ZEND_API void ZEND_FASTCALL _zend_mm_free(zend_mm_heap *heap, void *ptr ZEND_FIL
25792588
25802589void * ZEND_FASTCALL _zend_mm_realloc (zend_mm_heap * heap , void * ptr , size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
25812590{
2582- return zend_mm_realloc_heap (heap , ptr , size , 0 , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2591+ return zend_mm_realloc_heap (heap , ptr , size , EREALLOC_DEFAULT , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
25832592}
25842593
25852594void * ZEND_FASTCALL _zend_mm_realloc2 (zend_mm_heap * heap , void * ptr , size_t size , size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
25862595{
2587- return zend_mm_realloc_heap (heap , ptr , size , 1 , copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2596+ return zend_mm_realloc_heap (heap , ptr , size , EREALLOC_COPY , copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2597+ }
2598+
2599+ void * ZEND_FASTCALL _zend_mm_realloc3 (zend_mm_heap * heap , void * ptr , size_t size , size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
2600+ {
2601+ return zend_mm_realloc_heap (heap , ptr , size , EREALLOC_NOSHRINK , copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
25882602}
25892603
25902604ZEND_API size_t ZEND_FASTCALL _zend_mm_block_size (zend_mm_heap * heap , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
@@ -2801,7 +2815,7 @@ ZEND_API void* ZEND_FASTCALL _erealloc(void *ptr, size_t size ZEND_FILE_LINE_DC
28012815 return AG (mm_heap )-> custom_heap ._realloc (ptr , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
28022816 }
28032817#endif
2804- return zend_mm_realloc_heap (AG (mm_heap ), ptr , size , 0 , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2818+ return zend_mm_realloc_heap (AG (mm_heap ), ptr , size , EREALLOC_DEFAULT , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
28052819}
28062820
28072821ZEND_API void * ZEND_FASTCALL _erealloc2 (void * ptr , size_t size , size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
@@ -2811,7 +2825,17 @@ ZEND_API void* ZEND_FASTCALL _erealloc2(void *ptr, size_t size, size_t copy_size
28112825 return AG (mm_heap )-> custom_heap ._realloc (ptr , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
28122826 }
28132827#endif
2814- return zend_mm_realloc_heap (AG (mm_heap ), ptr , size , 1 , copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2828+ return zend_mm_realloc_heap (AG (mm_heap ), ptr , size , EREALLOC_COPY , copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2829+ }
2830+
2831+ ZEND_API void * ZEND_FASTCALL _erealloc3 (void * ptr , size_t size , size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
2832+ {
2833+ #if ZEND_MM_CUSTOM
2834+ if (UNEXPECTED (AG (mm_heap )-> use_custom_heap )) {
2835+ return AG (mm_heap )-> custom_heap ._realloc (ptr , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2836+ }
2837+ #endif
2838+ return zend_mm_realloc_heap (AG (mm_heap ), ptr , size , EREALLOC_NOSHRINK , copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
28152839}
28162840
28172841ZEND_API size_t ZEND_FASTCALL _zend_mem_block_size (void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
0 commit comments