@@ -266,9 +266,18 @@ struct _zend_mm_heap {
266266 int cached_chunks_count ; /* number of cached chunks */
267267 double avg_chunks_count ; /* average number of chunks allocated per request */
268268#if ZEND_MM_CUSTOM
269- void * (* _malloc )(size_t );
270- void (* _free )(void * );
271- void * (* _realloc )(void * , size_t );
269+ union {
270+ struct {
271+ void * (* _malloc )(size_t );
272+ void (* _free )(void * );
273+ void * (* _realloc )(void * , size_t );
274+ } std ;
275+ struct {
276+ void * (* _malloc )(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
277+ void (* _free )(void * ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
278+ void * (* _realloc )(void * , size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
279+ } debug ;
280+ } custom_heap ;
272281#endif
273282};
274283
@@ -1810,7 +1819,7 @@ static zend_mm_heap *zend_mm_init(void)
18101819 heap -> overflow = 0 ;
18111820#endif
18121821#if ZEND_MM_CUSTOM
1813- heap -> use_custom_heap = 0 ;
1822+ heap -> use_custom_heap = ZEND_MM_CUSTOM_HEAP_NONE ;
18141823#endif
18151824#if ZEND_MM_STORAGE
18161825 heap -> storage = NULL ;
@@ -2111,7 +2120,11 @@ void zend_mm_shutdown(zend_mm_heap *heap, int full, int silent)
21112120#if ZEND_MM_CUSTOM
21122121 if (heap -> use_custom_heap ) {
21132122 if (full ) {
2114- heap -> _free (heap );
2123+ if (ZEND_DEBUG && heap -> use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2124+ heap -> custom_heap .debug ._free (heap ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC );
2125+ } else {
2126+ heap -> custom_heap .std ._free (heap );
2127+ }
21152128 }
21162129 return ;
21172130 }
@@ -2258,12 +2271,20 @@ ZEND_API int is_zend_mm(void)
22582271#if ZEND_MM_CUSTOM
22592272# define ZEND_MM_CUSTOM_ALLOCATOR (size ) do { \
22602273 if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) { \
2261- return AG(mm_heap)->_malloc(size); \
2274+ if (ZEND_DEBUG && AG(mm_heap)->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) { \
2275+ return AG(mm_heap)->custom_heap.debug._malloc(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
2276+ } else { \
2277+ return AG(mm_heap)->custom_heap.std._malloc(size); \
2278+ } \
22622279 } \
22632280 } while (0)
22642281# define ZEND_MM_CUSTOM_DEALLOCATOR (ptr ) do { \
22652282 if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) { \
2266- AG(mm_heap)->_free(ptr); \
2283+ if (ZEND_DEBUG && AG(mm_heap)->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) { \
2284+ AG(mm_heap)->custom_heap.debug._free(ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
2285+ } else { \
2286+ AG(mm_heap)->custom_heap.std._free(ptr); \
2287+ } \
22672288 return; \
22682289 } \
22692290 } while (0)
@@ -2353,7 +2374,11 @@ ZEND_API void* ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LI
23532374
23542375#if ZEND_MM_CUSTOM
23552376 if (UNEXPECTED (AG (mm_heap )-> use_custom_heap )) {
2356- return AG (mm_heap )-> _malloc (size );
2377+ if (ZEND_DEBUG && AG (mm_heap )-> use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2378+ return AG (mm_heap )-> custom_heap .debug ._malloc (size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2379+ } else {
2380+ return AG (mm_heap )-> custom_heap .std ._malloc (size );
2381+ }
23572382 }
23582383#endif
23592384 return zend_mm_alloc_heap (AG (mm_heap ), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
@@ -2364,7 +2389,11 @@ ZEND_API void ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_OR
23642389
23652390#if ZEND_MM_CUSTOM
23662391 if (UNEXPECTED (AG (mm_heap )-> use_custom_heap )) {
2367- AG (mm_heap )-> _free (ptr );
2392+ if (ZEND_DEBUG && AG (mm_heap )-> use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2393+ AG (mm_heap )-> custom_heap .debug ._free (ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2394+ } else {
2395+ AG (mm_heap )-> custom_heap .std ._free (ptr );
2396+ }
23682397 return ;
23692398 }
23702399#endif
@@ -2375,7 +2404,11 @@ ZEND_API void* ZEND_FASTCALL _erealloc(void *ptr, size_t size ZEND_FILE_LINE_DC
23752404{
23762405
23772406 if (UNEXPECTED (AG (mm_heap )-> use_custom_heap )) {
2378- return AG (mm_heap )-> _realloc (ptr , size );
2407+ if (ZEND_DEBUG && AG (mm_heap )-> use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2408+ return AG (mm_heap )-> custom_heap .debug ._realloc (ptr , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2409+ } else {
2410+ return AG (mm_heap )-> custom_heap .std ._realloc (ptr , size );
2411+ }
23792412 }
23802413 return zend_mm_realloc_heap (AG (mm_heap ), ptr , size , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
23812414}
@@ -2384,7 +2417,11 @@ ZEND_API void* ZEND_FASTCALL _erealloc2(void *ptr, size_t size, size_t copy_size
23842417{
23852418
23862419 if (UNEXPECTED (AG (mm_heap )-> use_custom_heap )) {
2387- return AG (mm_heap )-> _realloc (ptr , size );
2420+ if (ZEND_DEBUG && AG (mm_heap )-> use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2421+ return AG (mm_heap )-> custom_heap .debug ._realloc (ptr , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2422+ } else {
2423+ return AG (mm_heap )-> custom_heap .std ._realloc (ptr , size );
2424+ }
23882425 }
23892426 return zend_mm_realloc_heap (AG (mm_heap ), ptr , size , copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
23902427}
@@ -2549,10 +2586,10 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
25492586 if (tmp && !zend_atoi (tmp , 0 )) {
25502587 alloc_globals -> mm_heap = malloc (sizeof (zend_mm_heap ));
25512588 memset (alloc_globals -> mm_heap , 0 , sizeof (zend_mm_heap ));
2552- alloc_globals -> mm_heap -> use_custom_heap = 1 ;
2553- alloc_globals -> mm_heap -> _malloc = malloc ;
2554- alloc_globals -> mm_heap -> _free = free ;
2555- alloc_globals -> mm_heap -> _realloc = realloc ;
2589+ alloc_globals -> mm_heap -> use_custom_heap = ZEND_MM_CUSTOM_HEAP_STD ;
2590+ alloc_globals -> mm_heap -> custom_heap . std . _malloc = malloc ;
2591+ alloc_globals -> mm_heap -> custom_heap . std . _free = free ;
2592+ alloc_globals -> mm_heap -> custom_heap . std . _realloc = realloc ;
25562593 return ;
25572594 }
25582595#endif
@@ -2614,10 +2651,10 @@ ZEND_API void zend_mm_set_custom_handlers(zend_mm_heap *heap,
26142651#if ZEND_MM_CUSTOM
26152652 zend_mm_heap * _heap = (zend_mm_heap * )heap ;
26162653
2617- _heap -> use_custom_heap = 1 ;
2618- _heap -> _malloc = _malloc ;
2619- _heap -> _free = _free ;
2620- _heap -> _realloc = _realloc ;
2654+ _heap -> use_custom_heap = ZEND_MM_CUSTOM_HEAP_STD ;
2655+ _heap -> custom_heap . std . _malloc = _malloc ;
2656+ _heap -> custom_heap . std . _free = _free ;
2657+ _heap -> custom_heap . std . _realloc = _realloc ;
26212658#endif
26222659}
26232660
@@ -2630,9 +2667,9 @@ ZEND_API void zend_mm_get_custom_handlers(zend_mm_heap *heap,
26302667 zend_mm_heap * _heap = (zend_mm_heap * )heap ;
26312668
26322669 if (heap -> use_custom_heap ) {
2633- * _malloc = _heap -> _malloc ;
2634- * _free = _heap -> _free ;
2635- * _realloc = _heap -> _realloc ;
2670+ * _malloc = _heap -> custom_heap . std . _malloc ;
2671+ * _free = _heap -> custom_heap . std . _free ;
2672+ * _realloc = _heap -> custom_heap . std . _realloc ;
26362673 } else {
26372674 * _malloc = NULL ;
26382675 * _free = NULL ;
@@ -2645,6 +2682,23 @@ ZEND_API void zend_mm_get_custom_handlers(zend_mm_heap *heap,
26452682#endif
26462683}
26472684
2685+ #if ZEND_DEBUG
2686+ ZEND_API void zend_mm_set_custom_debug_handlers (zend_mm_heap * heap ,
2687+ void * (* _malloc )(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
2688+ void (* _free )(void * ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
2689+ void * (* _realloc )(void * , size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ))
2690+ {
2691+ #if ZEND_MM_CUSTOM
2692+ zend_mm_heap * _heap = (zend_mm_heap * )heap ;
2693+
2694+ _heap -> use_custom_heap = ZEND_MM_CUSTOM_HEAP_DEBUG ;
2695+ _heap -> custom_heap .debug ._malloc = _malloc ;
2696+ _heap -> custom_heap .debug ._free = _free ;
2697+ _heap -> custom_heap .debug ._realloc = _realloc ;
2698+ #endif
2699+ }
2700+ #endif
2701+
26482702ZEND_API zend_mm_storage * zend_mm_get_storage (zend_mm_heap * heap )
26492703{
26502704#if ZEND_MM_STORAGE
0 commit comments