@@ -203,9 +203,21 @@ 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
207
zend_mm_observer * next ;
207
208
};
208
209
210
+ #define HANDLE_OBSERVERS (heap , use_custom_heap , observer_function , ...) \
211
+ if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
212
+ zend_mm_observer *current = heap->observers; \
213
+ while (current != NULL) { \
214
+ if (current->observer_function != NULL) { \
215
+ current->observer_function(__VA_ARGS__ ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
216
+ } \
217
+ current = current->next; \
218
+ } \
219
+ }
220
+
209
221
/*
210
222
* Memory is retrieved from OS by chunks of fixed size 2MB.
211
223
* Inside chunk it's managed by pages of fixed size 4096B.
@@ -1966,7 +1978,9 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
1966
1978
size_t collected = 0 ;
1967
1979
1968
1980
#if ZEND_MM_CUSTOM
1969
- if (heap -> use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
1981
+ int use_custom_heap = heap -> use_custom_heap ;
1982
+ if (use_custom_heap & ~ZEND_MM_CUSTOM_HEAP_OBSERVED ) {
1983
+ HANDLE_OBSERVERS (heap , use_custom_heap , gc ,0 );
1970
1984
return 0 ;
1971
1985
}
1972
1986
#endif
@@ -2065,6 +2079,10 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
2065
2079
}
2066
2080
} while (chunk != heap -> main_chunk );
2067
2081
2082
+ #if ZEND_MM_CUSTOM
2083
+ HANDLE_OBSERVERS (heap , use_custom_heap , gc , collected * ZEND_MM_PAGE_SIZE );
2084
+ #endif
2085
+
2068
2086
return collected * ZEND_MM_PAGE_SIZE ;
2069
2087
}
2070
2088
@@ -2494,17 +2512,6 @@ ZEND_API bool is_zend_ptr(const void *ptr)
2494
2512
2495
2513
#if ZEND_MM_CUSTOM
2496
2514
2497
- #define HANDLE_OBSERVERS (observer_function , ...) \
2498
- if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
2499
- zend_mm_observer *current = heap->observers; \
2500
- while (current != NULL) { \
2501
- if (current->observer_function != NULL) { \
2502
- current->observer_function(__VA_ARGS__ ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
2503
- } \
2504
- current = current->next; \
2505
- } \
2506
- }
2507
-
2508
2515
static ZEND_COLD void * ZEND_FASTCALL _malloc_custom (size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
2509
2516
{
2510
2517
void * ptr ;
@@ -2518,7 +2525,7 @@ static ZEND_COLD void* ZEND_FASTCALL _malloc_custom(size_t size ZEND_FILE_LINE_D
2518
2525
// no custom memory manager, only observer present
2519
2526
ptr = zend_mm_alloc_heap (AG (mm_heap ), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2520
2527
}
2521
- HANDLE_OBSERVERS (malloc , size , ptr )
2528
+ HANDLE_OBSERVERS (heap , use_custom_heap , malloc , size , ptr )
2522
2529
return ptr ;
2523
2530
}
2524
2531
@@ -2527,7 +2534,7 @@ static ZEND_COLD void ZEND_FASTCALL _efree_custom(void *ptr ZEND_FILE_LINE_DC ZE
2527
2534
zend_mm_heap * heap = AG (mm_heap );
2528
2535
int use_custom_heap = heap -> use_custom_heap ;
2529
2536
2530
- HANDLE_OBSERVERS (free , ptr )
2537
+ HANDLE_OBSERVERS (heap , use_custom_heap , free , ptr )
2531
2538
2532
2539
if (ZEND_DEBUG && use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG ) {
2533
2540
heap -> custom_heap .debug ._free (ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
@@ -2552,7 +2559,7 @@ static ZEND_COLD void* ZEND_FASTCALL _realloc_custom(void *ptr, size_t size ZEND
2552
2559
// no custom memory manager, only observer present
2553
2560
new_ptr = zend_mm_realloc_heap (AG (mm_heap ), ptr , size , 0 , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2554
2561
}
2555
- HANDLE_OBSERVERS (realloc , ptr , size , new_ptr )
2562
+ HANDLE_OBSERVERS (heap , use_custom_heap , realloc , ptr , size , new_ptr )
2556
2563
return new_ptr ;
2557
2564
}
2558
2565
#endif
@@ -3091,7 +3098,8 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
3091
3098
zend_mm_heap * heap ,
3092
3099
void (* malloc )(size_t len , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3093
3100
void (* free )(void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ),
3094
- void (* realloc )(void * old_ptr , size_t len , void * new_ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
3101
+ 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 )
3095
3103
) {
3096
3104
#if ZEND_MM_CUSTOM
3097
3105
if (!heap ) {
@@ -3103,6 +3111,7 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
3103
3111
node -> malloc = malloc ;
3104
3112
node -> free = free ;
3105
3113
node -> realloc = realloc ;
3114
+ node -> gc = gc ;
3106
3115
node -> next = NULL ;
3107
3116
3108
3117
// set bitflag for observers being around
0 commit comments