5050 * with more specialized routines when the requested size is known.
5151 */
5252
53- #include "php.h"
5453#include "zend.h"
5554#include "zend_alloc.h"
5655#include "zend_globals.h"
@@ -240,6 +239,8 @@ struct _zend_mm_observer {
240239 zend_mm_observer * next ;
241240};
242241
242+ static void zend_mm_observers_shutdown (zend_mm_heap * heap );
243+
243244#define HANDLE_OBSERVERS (observer_function , ...) \
244245 if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
245246 zend_mm_observer *current = heap->observers; \
@@ -2480,7 +2481,6 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
24802481 zend_mm_chunk * p ;
24812482 zend_mm_huge_list * list ;
24822483
2483- // Call observer shutdown callbacks before cleaning up
24842484#if ZEND_MM_CUSTOM
24852485 if (heap -> use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
24862486 zend_mm_observer * current = heap -> observers ;
@@ -2490,14 +2490,9 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
24902490 }
24912491 current = current -> next ;
24922492 }
2493- }
2494- #endif
2495-
2496- if (full == false) {
24972493 zend_mm_observers_shutdown (heap );
24982494 }
24992495
2500- #if ZEND_MM_CUSTOM
25012496 if (heap -> use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
25022497 if (heap -> custom_heap ._malloc == tracked_malloc ) {
25032498 if (silent ) {
@@ -2651,7 +2646,7 @@ void* ZEND_FASTCALL _zend_mm_realloc2(zend_mm_heap *heap, void *ptr, size_t size
26512646ZEND_API size_t ZEND_FASTCALL _zend_mm_block_size (zend_mm_heap * heap , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
26522647{
26532648#if ZEND_MM_CUSTOM
2654- if (UNEXPECTED (heap -> use_custom_heap )) {
2649+ if (UNEXPECTED (heap -> use_custom_heap & ~ ZEND_MM_CUSTOM_HEAP_OBSERVED )) {
26552650 if (heap -> custom_heap ._malloc == tracked_malloc ) {
26562651 zend_ulong h = ((uintptr_t ) ptr ) >> ZEND_MM_ALIGNMENT_LOG2 ;
26572652 zval * size_zv = zend_hash_index_find (heap -> tracked_allocs , h );
@@ -2734,14 +2729,45 @@ ZEND_API bool is_zend_ptr(const void *ptr)
27342729#undef _emalloc
27352730
27362731#if ZEND_MM_CUSTOM
2732+ static ZEND_COLD void * ZEND_FASTCALL zend_mm_alloc_custom (size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
2733+ {
2734+ zend_mm_heap * heap = AG (mm_heap );
2735+ int use_custom_heap = heap -> use_custom_heap ;
2736+ void * ptr ;
2737+
2738+ if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
2739+ ptr = heap -> custom_heap ._malloc (size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2740+ } else {
2741+ ptr = zend_mm_alloc_heap (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2742+ }
2743+
2744+ HANDLE_OBSERVERS (malloc , size , ptr )
2745+
2746+ return ptr ;
2747+ }
2748+
2749+ static ZEND_COLD void ZEND_FASTCALL zend_mm_free_custom (void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
2750+ {
2751+ zend_mm_heap * heap = AG (mm_heap );
2752+ int use_custom_heap = heap -> use_custom_heap ;
2753+
2754+ HANDLE_OBSERVERS (free , ptr )
2755+
2756+ if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
2757+ heap -> custom_heap ._free (ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2758+ } else {
2759+ zend_mm_free_heap (heap , ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2760+ }
2761+ }
2762+
27372763# define ZEND_MM_CUSTOM_ALLOCATOR (size ) do { \
2738- if (UNEXPECTED(AG(mm_heap)->use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED )) { \
2739- return AG(mm_heap)->custom_heap._malloc (size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
2764+ if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) { \
2765+ return zend_mm_alloc_custom (size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
27402766 } \
27412767 } while (0)
27422768# define ZEND_MM_CUSTOM_DEALLOCATOR (ptr ) do { \
2743- if (UNEXPECTED(AG(mm_heap)->use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED )) { \
2744- AG(mm_heap)->custom_heap._free (ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
2769+ if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) { \
2770+ zend_mm_free_custom (ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
27452771 return; \
27462772 } \
27472773 } while (0)
@@ -2842,15 +2868,15 @@ ZEND_API void* ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LI
28422868 if (UNEXPECTED (use_custom_heap )) {
28432869 void * ptr ;
28442870
2845- // Check for actual custom handler (excluding observer bit)
2871+ /* Check for actual custom handler (excluding observer bit) */
28462872 if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
28472873 ptr = heap -> custom_heap ._malloc (size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
28482874 } else {
2849- // No custom handler, use default heap
2875+ /* No custom handler, use default heap */
28502876 ptr = zend_mm_alloc_heap (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
28512877 }
28522878
2853- // Call observers if present
2879+ /* Call observers if present */
28542880 HANDLE_OBSERVERS (malloc , size , ptr )
28552881
28562882 return ptr ;
@@ -2866,14 +2892,14 @@ ZEND_API void ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_OR
28662892 int use_custom_heap = heap -> use_custom_heap ;
28672893
28682894 if (UNEXPECTED (use_custom_heap )) {
2869- // Call observers first (before free)
2895+ /* Call observers first (before free) */
28702896 HANDLE_OBSERVERS (free , ptr )
28712897
2872- // Check for actual custom handler (excluding observer bit)
2898+ /* Check for actual custom handler (excluding observer bit) */
28732899 if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
28742900 heap -> custom_heap ._free (ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
28752901 } else {
2876- // No custom handler, use default heap
2902+ /* No custom handler, use default heap */
28772903 zend_mm_free_heap (heap , ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
28782904 }
28792905 return ;
@@ -2891,15 +2917,15 @@ ZEND_API void* ZEND_FASTCALL _erealloc(void *ptr, size_t size ZEND_FILE_LINE_DC
28912917 if (UNEXPECTED (use_custom_heap )) {
28922918 void * new_ptr ;
28932919
2894- // Check for actual custom handler (excluding observer bit)
2920+ /* Check for actual custom handler (excluding observer bit) */
28952921 if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
28962922 new_ptr = heap -> custom_heap ._realloc (ptr , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
28972923 } else {
2898- // No custom handler, use default heap
2924+ /* No custom handler, use default heap */
28992925 new_ptr = zend_mm_realloc_heap (heap , ptr , size , 0 , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
29002926 }
29012927
2902- // Call observers if present
2928+ /* Call observers if present */
29032929 HANDLE_OBSERVERS (realloc , ptr , size , new_ptr )
29042930
29052931 return new_ptr ;
@@ -2917,15 +2943,15 @@ ZEND_API void* ZEND_FASTCALL _erealloc2(void *ptr, size_t size, size_t copy_size
29172943 if (UNEXPECTED (use_custom_heap )) {
29182944 void * new_ptr ;
29192945
2920- // Check for actual custom handler (excluding observer bit)
2946+ /* Check for actual custom handler (excluding observer bit) */
29212947 if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
29222948 new_ptr = heap -> custom_heap ._realloc (ptr , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
29232949 } else {
2924- // No custom handler, use default heap
2950+ /* No custom handler, use default heap */
29252951 new_ptr = zend_mm_realloc_heap (heap , ptr , size , 1 , copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
29262952 }
29272953
2928- // Call observers if present
2954+ /* Call observers if present */
29292955 HANDLE_OBSERVERS (realloc , ptr , size , new_ptr )
29302956
29312957 return new_ptr ;
@@ -3443,7 +3469,6 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
34433469#ifdef ZTS
34443470static void alloc_globals_dtor (zend_alloc_globals * alloc_globals )
34453471{
3446- zend_mm_observers_shutdown (alloc_globals -> mm_heap );
34473472 zend_mm_shutdown (alloc_globals -> mm_heap , 1 , 1 );
34483473}
34493474#endif
@@ -3645,7 +3670,7 @@ ZEND_API bool zend_mm_observer_unregister(zend_mm_heap *heap, zend_mm_observer *
36453670 }
36463671 pefree (current , 1 );
36473672
3648- // Update flag if no more observers
3673+ /* Update flag if no more observers */
36493674 if (heap -> observers == NULL ) {
36503675 heap -> use_custom_heap &= ~ZEND_MM_CUSTOM_HEAP_OBSERVED ;
36513676 }
@@ -3658,16 +3683,9 @@ ZEND_API bool zend_mm_observer_unregister(zend_mm_heap *heap, zend_mm_observer *
36583683 return false;
36593684}
36603685
3661- void zend_mm_observers_shutdown (zend_mm_heap * heap )
3686+ static void zend_mm_observers_shutdown (zend_mm_heap * heap )
36623687{
36633688#if ZEND_MM_CUSTOM
3664- if (heap == NULL ) {
3665- heap = AG (mm_heap );
3666- if (heap == NULL ) {
3667- return ;
3668- }
3669- }
3670-
36713689 zend_mm_observer * current = heap -> observers ;
36723690 zend_mm_observer * next = NULL ;
36733691
@@ -3681,6 +3699,7 @@ void zend_mm_observers_shutdown(zend_mm_heap *heap)
36813699 heap -> use_custom_heap &= ~ZEND_MM_CUSTOM_HEAP_OBSERVED ;
36823700#endif
36833701}
3702+
36843703ZEND_API zend_mm_storage * zend_mm_get_storage (zend_mm_heap * heap )
36853704{
36863705#if ZEND_MM_STORAGE
@@ -3745,6 +3764,7 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_handlers *handlers, void
37453764#endif
37463765#if ZEND_MM_CUSTOM
37473766 heap -> use_custom_heap = 0 ;
3767+ heap -> observers = NULL ;
37483768#endif
37493769 heap -> storage = & tmp_storage ;
37503770 heap -> huge_list = NULL ;
0 commit comments