@@ -206,11 +206,23 @@ struct _zend_mm_observer {
206
206
void (* malloc )(size_t len , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
207
207
void (* free )(void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
208
208
void (* realloc )(void * old_ptr , size_t len , void * new_ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
209
- void (* gc )(size_t len ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
209
+ void (* gc )(size_t len );
210
+ void (* shutdown )(bool full , bool silent );
210
211
zend_mm_observer * next ;
211
212
};
212
213
213
- #define HANDLE_OBSERVERS (heap , use_custom_heap , observer_function , ...) \
214
+ #define HANDLE_NO_DEBUG_OBSERVERS (observer_function , ...) \
215
+ if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
216
+ zend_mm_observer *current = heap->observers; \
217
+ while (current != NULL) { \
218
+ if (current->observer_function != NULL) { \
219
+ current->observer_function(__VA_ARGS__); \
220
+ } \
221
+ current = current->next; \
222
+ } \
223
+ }
224
+
225
+ #define HANDLE_OBSERVERS (observer_function , ...) \
214
226
if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
215
227
zend_mm_observer *current = heap->observers; \
216
228
while (current != NULL) { \
@@ -1989,7 +2001,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
1989
2001
#if ZEND_MM_CUSTOM
1990
2002
int use_custom_heap = heap -> use_custom_heap ;
1991
2003
if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
1992
- HANDLE_OBSERVERS ( heap , use_custom_heap , gc ,0 );
2004
+ HANDLE_NO_DEBUG_OBSERVERS ( gc ,0 );
1993
2005
return 0 ;
1994
2006
}
1995
2007
#endif
@@ -2089,7 +2101,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
2089
2101
} while (chunk != heap -> main_chunk );
2090
2102
2091
2103
#if ZEND_MM_CUSTOM
2092
- HANDLE_OBSERVERS ( heap , use_custom_heap , gc , collected * ZEND_MM_PAGE_SIZE );
2104
+ HANDLE_NO_DEBUG_OBSERVERS ( gc , collected * ZEND_MM_PAGE_SIZE );
2093
2105
#endif
2094
2106
2095
2107
return collected * ZEND_MM_PAGE_SIZE ;
@@ -2297,8 +2309,12 @@ void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
2297
2309
zend_mm_huge_list * list ;
2298
2310
2299
2311
#if ZEND_MM_CUSTOM
2312
+ int use_custom_heap = heap -> use_custom_heap ;
2313
+
2314
+ HANDLE_NO_DEBUG_OBSERVERS (shutdown , full , silent )
2300
2315
zend_mm_observers_shutdown (heap );
2301
- if (heap -> use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
2316
+
2317
+ if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
2302
2318
if (heap -> custom_heap .std ._malloc == tracked_malloc ) {
2303
2319
if (silent ) {
2304
2320
tracked_free_all ();
@@ -2314,7 +2330,7 @@ void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
2314
2330
}
2315
2331
2316
2332
if (full ) {
2317
- if (ZEND_DEBUG && heap -> use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2333
+ if (ZEND_DEBUG && use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2318
2334
heap -> custom_heap .debug ._free (heap ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC );
2319
2335
} else {
2320
2336
heap -> custom_heap .std ._free (heap );
@@ -2534,7 +2550,7 @@ static ZEND_COLD void* ZEND_FASTCALL _malloc_custom(size_t size ZEND_FILE_LINE_D
2534
2550
// no custom memory manager, only observer present
2535
2551
ptr = zend_mm_alloc_heap (AG (mm_heap ), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2536
2552
}
2537
- HANDLE_OBSERVERS (heap , use_custom_heap , malloc , size , ptr )
2553
+ HANDLE_OBSERVERS (malloc , size , ptr )
2538
2554
return ptr ;
2539
2555
}
2540
2556
@@ -2543,7 +2559,7 @@ static ZEND_COLD void ZEND_FASTCALL _efree_custom(void *ptr ZEND_FILE_LINE_DC ZE
2543
2559
zend_mm_heap * heap = AG (mm_heap );
2544
2560
int use_custom_heap = heap -> use_custom_heap ;
2545
2561
2546
- HANDLE_OBSERVERS (heap , use_custom_heap , free , ptr )
2562
+ HANDLE_OBSERVERS (free , ptr )
2547
2563
2548
2564
if (ZEND_DEBUG && use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2549
2565
heap -> custom_heap .debug ._free (ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
@@ -2568,7 +2584,7 @@ static ZEND_COLD void* ZEND_FASTCALL _realloc_custom(void *ptr, size_t size ZEND
2568
2584
// no custom memory manager, only observer present
2569
2585
new_ptr = zend_mm_realloc_heap (AG (mm_heap ), ptr , size , 0 , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2570
2586
}
2571
- HANDLE_OBSERVERS (heap , use_custom_heap , realloc , ptr , size , new_ptr )
2587
+ HANDLE_OBSERVERS (realloc , ptr , size , new_ptr )
2572
2588
return new_ptr ;
2573
2589
}
2574
2590
#endif
@@ -3108,7 +3124,8 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
3108
3124
void (* malloc )(size_t len , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3109
3125
void (* free )(void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3110
3126
void (* realloc )(void * old_ptr , size_t len , void * new_ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3111
- void (* gc )(size_t len ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
3127
+ void (* gc )(size_t len ),
3128
+ void (* shutdown )(bool full , bool silent )
3112
3129
) {
3113
3130
#if ZEND_MM_CUSTOM
3114
3131
if (!heap ) {
@@ -3121,6 +3138,7 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
3121
3138
node -> free = free ;
3122
3139
node -> realloc = realloc ;
3123
3140
node -> gc = gc ;
3141
+ node -> shutdown = shutdown ;
3124
3142
node -> next = NULL ;
3125
3143
3126
3144
// set bitflag for observers being around
0 commit comments