@@ -206,9 +206,21 @@ 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
210
zend_mm_observer * next ;
210
211
};
211
212
213
+ #define HANDLE_OBSERVERS (heap , use_custom_heap , observer_function , ...) \
214
+ if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
215
+ zend_mm_observer *current = heap->observers; \
216
+ while (current != NULL) { \
217
+ if (current->observer_function != NULL) { \
218
+ current->observer_function(__VA_ARGS__ ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
219
+ } \
220
+ current = current->next; \
221
+ } \
222
+ }
223
+
212
224
/*
213
225
* Memory is retrieved from OS by chunks of fixed size 2MB.
214
226
* Inside chunk it's managed by pages of fixed size 4096B.
@@ -1975,7 +1987,9 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
1975
1987
size_t collected = 0 ;
1976
1988
1977
1989
#if ZEND_MM_CUSTOM
1978
- if (heap -> use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
1990
+ int use_custom_heap = heap -> use_custom_heap ;
1991
+ if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
1992
+ HANDLE_OBSERVERS (heap , use_custom_heap , gc ,0 );
1979
1993
return 0 ;
1980
1994
}
1981
1995
#endif
@@ -2074,6 +2088,10 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
2074
2088
}
2075
2089
} while (chunk != heap -> main_chunk );
2076
2090
2091
+ #if ZEND_MM_CUSTOM
2092
+ HANDLE_OBSERVERS (heap , use_custom_heap , gc , collected * ZEND_MM_PAGE_SIZE );
2093
+ #endif
2094
+
2077
2095
return collected * ZEND_MM_PAGE_SIZE ;
2078
2096
}
2079
2097
@@ -2503,17 +2521,6 @@ ZEND_API bool is_zend_ptr(const void *ptr)
2503
2521
2504
2522
#if ZEND_MM_CUSTOM
2505
2523
2506
- #define HANDLE_OBSERVERS (observer_function , ...) \
2507
- if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
2508
- zend_mm_observer *current = heap->observers; \
2509
- while (current != NULL) { \
2510
- if (current->observer_function != NULL) { \
2511
- current->observer_function(__VA_ARGS__ ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
2512
- } \
2513
- current = current->next; \
2514
- } \
2515
- }
2516
-
2517
2524
static ZEND_COLD void * ZEND_FASTCALL _malloc_custom (size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
2518
2525
{
2519
2526
void * ptr ;
@@ -2527,7 +2534,7 @@ static ZEND_COLD void* ZEND_FASTCALL _malloc_custom(size_t size ZEND_FILE_LINE_D
2527
2534
// no custom memory manager, only observer present
2528
2535
ptr = zend_mm_alloc_heap (AG (mm_heap ), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2529
2536
}
2530
- HANDLE_OBSERVERS (malloc , size , ptr )
2537
+ HANDLE_OBSERVERS (heap , use_custom_heap , malloc , size , ptr )
2531
2538
return ptr ;
2532
2539
}
2533
2540
@@ -2536,7 +2543,7 @@ static ZEND_COLD void ZEND_FASTCALL _efree_custom(void *ptr ZEND_FILE_LINE_DC ZE
2536
2543
zend_mm_heap * heap = AG (mm_heap );
2537
2544
int use_custom_heap = heap -> use_custom_heap ;
2538
2545
2539
- HANDLE_OBSERVERS (free , ptr )
2546
+ HANDLE_OBSERVERS (heap , use_custom_heap , free , ptr )
2540
2547
2541
2548
if (ZEND_DEBUG && use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2542
2549
heap -> custom_heap .debug ._free (ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
@@ -2561,7 +2568,7 @@ static ZEND_COLD void* ZEND_FASTCALL _realloc_custom(void *ptr, size_t size ZEND
2561
2568
// no custom memory manager, only observer present
2562
2569
new_ptr = zend_mm_realloc_heap (AG (mm_heap ), ptr , size , 0 , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2563
2570
}
2564
- HANDLE_OBSERVERS (realloc , ptr , size , new_ptr )
2571
+ HANDLE_OBSERVERS (heap , use_custom_heap , realloc , ptr , size , new_ptr )
2565
2572
return new_ptr ;
2566
2573
}
2567
2574
#endif
@@ -3100,7 +3107,8 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
3100
3107
zend_mm_heap * heap ,
3101
3108
void (* malloc )(size_t len , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3102
3109
void (* free )(void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3103
- void (* realloc )(void * old_ptr , size_t len , void * new_ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
3110
+ 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 )
3104
3112
) {
3105
3113
#if ZEND_MM_CUSTOM
3106
3114
if (!heap ) {
@@ -3112,6 +3120,7 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
3112
3120
node -> malloc = malloc ;
3113
3121
node -> free = free ;
3114
3122
node -> realloc = realloc ;
3123
+ node -> gc = gc ;
3115
3124
node -> next = NULL ;
3116
3125
3117
3126
// set bitflag for observers being around
0 commit comments