@@ -203,11 +203,23 @@ struct _zend_mm_observer {
203
203
void (* malloc )(size_t len , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
204
204
void (* free )(void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
205
205
void (* realloc )(void * old_ptr , size_t len , void * new_ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
206
- void (* gc )(size_t len ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC );
206
+ void (* gc )(size_t len );
207
+ void (* shutdown )(bool full , bool silent );
207
208
zend_mm_observer * next ;
208
209
};
209
210
210
- #define HANDLE_OBSERVERS (heap , use_custom_heap , observer_function , ...) \
211
+ #define HANDLE_NO_DEBUG_OBSERVERS (observer_function , ...) \
212
+ if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
213
+ zend_mm_observer *current = heap->observers; \
214
+ while (current != NULL) { \
215
+ if (current->observer_function != NULL) { \
216
+ current->observer_function(__VA_ARGS__); \
217
+ } \
218
+ current = current->next; \
219
+ } \
220
+ }
221
+
222
+ #define HANDLE_OBSERVERS (observer_function , ...) \
211
223
if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
212
224
zend_mm_observer *current = heap->observers; \
213
225
while (current != NULL) { \
@@ -1980,7 +1992,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
1980
1992
#if ZEND_MM_CUSTOM
1981
1993
int use_custom_heap = heap -> use_custom_heap ;
1982
1994
if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
1983
- HANDLE_OBSERVERS ( heap , use_custom_heap , gc ,0 );
1995
+ HANDLE_NO_DEBUG_OBSERVERS ( gc ,0 );
1984
1996
return 0 ;
1985
1997
}
1986
1998
#endif
@@ -2080,7 +2092,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
2080
2092
} while (chunk != heap -> main_chunk );
2081
2093
2082
2094
#if ZEND_MM_CUSTOM
2083
- HANDLE_OBSERVERS ( heap , use_custom_heap , gc , collected * ZEND_MM_PAGE_SIZE );
2095
+ HANDLE_NO_DEBUG_OBSERVERS ( gc , collected * ZEND_MM_PAGE_SIZE );
2084
2096
#endif
2085
2097
2086
2098
return collected * ZEND_MM_PAGE_SIZE ;
@@ -2288,8 +2300,12 @@ void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
2288
2300
zend_mm_huge_list * list ;
2289
2301
2290
2302
#if ZEND_MM_CUSTOM
2303
+ int use_custom_heap = heap -> use_custom_heap ;
2304
+
2305
+ HANDLE_NO_DEBUG_OBSERVERS (shutdown , full , silent )
2291
2306
zend_mm_observers_shutdown (heap );
2292
- if (heap -> use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
2307
+
2308
+ if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
2293
2309
if (heap -> custom_heap .std ._malloc == tracked_malloc ) {
2294
2310
if (silent ) {
2295
2311
tracked_free_all ();
@@ -2305,7 +2321,7 @@ void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
2305
2321
}
2306
2322
2307
2323
if (full ) {
2308
- if (ZEND_DEBUG && heap -> use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2324
+ if (ZEND_DEBUG && use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2309
2325
heap -> custom_heap .debug ._free (heap ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC );
2310
2326
} else {
2311
2327
heap -> custom_heap .std ._free (heap );
@@ -2525,7 +2541,7 @@ static ZEND_COLD void* ZEND_FASTCALL _malloc_custom(size_t size ZEND_FILE_LINE_D
2525
2541
// no custom memory manager, only observer present
2526
2542
ptr = zend_mm_alloc_heap (AG (mm_heap ), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2527
2543
}
2528
- HANDLE_OBSERVERS (heap , use_custom_heap , malloc , size , ptr )
2544
+ HANDLE_OBSERVERS (malloc , size , ptr )
2529
2545
return ptr ;
2530
2546
}
2531
2547
@@ -2534,7 +2550,7 @@ static ZEND_COLD void ZEND_FASTCALL _efree_custom(void *ptr ZEND_FILE_LINE_DC ZE
2534
2550
zend_mm_heap * heap = AG (mm_heap );
2535
2551
int use_custom_heap = heap -> use_custom_heap ;
2536
2552
2537
- HANDLE_OBSERVERS (heap , use_custom_heap , free , ptr )
2553
+ HANDLE_OBSERVERS (free , ptr )
2538
2554
2539
2555
if (ZEND_DEBUG && use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2540
2556
heap -> custom_heap .debug ._free (ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
@@ -2559,7 +2575,7 @@ static ZEND_COLD void* ZEND_FASTCALL _realloc_custom(void *ptr, size_t size ZEND
2559
2575
// no custom memory manager, only observer present
2560
2576
new_ptr = zend_mm_realloc_heap (AG (mm_heap ), ptr , size , 0 , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2561
2577
}
2562
- HANDLE_OBSERVERS (heap , use_custom_heap , realloc , ptr , size , new_ptr )
2578
+ HANDLE_OBSERVERS (realloc , ptr , size , new_ptr )
2563
2579
return new_ptr ;
2564
2580
}
2565
2581
#endif
@@ -3099,7 +3115,8 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
3099
3115
void (* malloc )(size_t len , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3100
3116
void (* free )(void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3101
3117
void (* realloc )(void * old_ptr , size_t len , void * new_ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3102
- void (* gc )(size_t len ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
3118
+ void (* gc )(size_t len ),
3119
+ void (* shutdown )(bool full , bool silent )
3103
3120
) {
3104
3121
#if ZEND_MM_CUSTOM
3105
3122
if (!heap ) {
@@ -3112,6 +3129,7 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
3112
3129
node -> free = free ;
3113
3130
node -> realloc = realloc ;
3114
3131
node -> gc = gc ;
3132
+ node -> shutdown = shutdown ;
3115
3133
node -> next = NULL ;
3116
3134
3117
3135
// set bitflag for observers being around
0 commit comments