Skip to content

Commit 02bca4d

Browse files
Add shutdown observer and fix debug builds
1 parent 78cc7ce commit 02bca4d

File tree

4 files changed

+58
-20
lines changed

4 files changed

+58
-20
lines changed

Zend/zend_alloc.c

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,23 @@ struct _zend_mm_observer {
203203
void (*malloc)(size_t len, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
204204
void (*free)(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
205205
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);
207208
zend_mm_observer *next;
208209
};
209210

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, ...) \
211223
if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
212224
zend_mm_observer *current = heap->observers; \
213225
while (current != NULL) { \
@@ -1980,7 +1992,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
19801992
#if ZEND_MM_CUSTOM
19811993
int use_custom_heap = heap->use_custom_heap;
19821994
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);
19841996
return 0;
19851997
}
19861998
#endif
@@ -2080,7 +2092,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
20802092
} while (chunk != heap->main_chunk);
20812093

20822094
#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);
20842096
#endif
20852097

20862098
return collected * ZEND_MM_PAGE_SIZE;
@@ -2288,8 +2300,12 @@ void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
22882300
zend_mm_huge_list *list;
22892301

22902302
#if ZEND_MM_CUSTOM
2303+
int use_custom_heap = heap->use_custom_heap;
2304+
2305+
HANDLE_NO_DEBUG_OBSERVERS(shutdown, full, silent)
22912306
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) {
22932309
if (heap->custom_heap.std._malloc == tracked_malloc) {
22942310
if (silent) {
22952311
tracked_free_all();
@@ -2305,7 +2321,7 @@ void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
23052321
}
23062322

23072323
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) {
23092325
heap->custom_heap.debug._free(heap ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC);
23102326
} else {
23112327
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
25252541
// no custom memory manager, only observer present
25262542
ptr = zend_mm_alloc_heap(AG(mm_heap), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
25272543
}
2528-
HANDLE_OBSERVERS(heap, use_custom_heap, malloc, size, ptr)
2544+
HANDLE_OBSERVERS(malloc, size, ptr)
25292545
return ptr;
25302546
}
25312547

@@ -2534,7 +2550,7 @@ static ZEND_COLD void ZEND_FASTCALL _efree_custom(void *ptr ZEND_FILE_LINE_DC ZE
25342550
zend_mm_heap *heap = AG(mm_heap);
25352551
int use_custom_heap = heap->use_custom_heap;
25362552

2537-
HANDLE_OBSERVERS(heap, use_custom_heap, free, ptr)
2553+
HANDLE_OBSERVERS(free, ptr)
25382554

25392555
if (ZEND_DEBUG && use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG) {
25402556
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
25592575
// no custom memory manager, only observer present
25602576
new_ptr = zend_mm_realloc_heap(AG(mm_heap), ptr, size, 0, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
25612577
}
2562-
HANDLE_OBSERVERS(heap, use_custom_heap, realloc, ptr, size, new_ptr)
2578+
HANDLE_OBSERVERS(realloc, ptr, size, new_ptr)
25632579
return new_ptr;
25642580
}
25652581
#endif
@@ -3099,7 +3115,8 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
30993115
void (*malloc)(size_t len, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
31003116
void (*free)(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
31013117
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)
31033120
) {
31043121
#if ZEND_MM_CUSTOM
31053122
if (!heap) {
@@ -3112,6 +3129,7 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
31123129
node->free = free;
31133130
node->realloc = realloc;
31143131
node->gc = gc;
3132+
node->shutdown = shutdown;
31153133
node->next = NULL;
31163134

31173135
// set bitflag for observers being around

Zend/zend_alloc.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,8 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
290290
void (*malloc)(size_t len, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
291291
void (*free)(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
292292
void (*realloc)(void *old_ptr, size_t len, void *new_ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
293-
void (*gc)(size_t len ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
293+
void (*gc)(size_t len),
294+
void (*shutdown)(bool full, bool silent)
294295
);
295296
ZEND_API bool zend_mm_observer_unregister(zend_mm_heap *heap, zend_mm_observer *observer);
296297
void zend_mm_observers_shutdown(zend_mm_heap *heap);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
ZendMM Observer: Observe shutdown
3+
--EXTENSIONS--
4+
zend_test
5+
--INI--
6+
zend_test.zend_mm_observer.enabled=1
7+
--FILE--
8+
<?php
9+
echo "done.";
10+
?>
11+
--EXPECTREGEX--
12+
.*shutdown in progress: full\(0\), silent\(1\).*

ext/zend_test/zend_mm_observer.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,6 @@ static void zend_mm_test_observer_malloc(size_t len, void *ptr ZEND_FILE_LINE_DC
3131
fflush(stdout);
3232
}
3333

34-
static void zend_mm_test_observer_gc(size_t len ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
35-
{
36-
printf("garbage collection ended with %zu bytes collected\n", len);
37-
fflush(stdout);
38-
}
39-
4034
static void zend_mm_test_observer_free(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
4135
{
4236
size_t block_len = 0;
@@ -57,6 +51,18 @@ static void zend_mm_test_observer_realloc(void *ptr, size_t len, void *newptr ZE
5751
fflush(stdout);
5852
}
5953

54+
static void zend_mm_test_observer_gc(size_t len)
55+
{
56+
printf("garbage collection ended with %zu bytes collected\n", len);
57+
fflush(stdout);
58+
}
59+
60+
static void zend_mm_test_observer_shutdown(bool full, bool silent)
61+
{
62+
printf("shutdown in progress: full(%d), silent(%d)\n", full, silent);
63+
fflush(stdout);
64+
}
65+
6066
static PHP_INI_MH(OnUpdateZendTestMMObserverEnabled)
6167
{
6268
if (new_value == NULL) {
@@ -72,7 +78,8 @@ static PHP_INI_MH(OnUpdateZendTestMMObserverEnabled)
7278
zend_mm_test_observer_malloc,
7379
zend_mm_test_observer_free,
7480
zend_mm_test_observer_realloc,
75-
zend_mm_test_observer_gc
81+
zend_mm_test_observer_gc,
82+
zend_mm_test_observer_shutdown
7683
);
7784
}
7885
} else {
@@ -105,7 +112,8 @@ void zend_test_mm_observer_rinit(void)
105112
zend_mm_test_observer_malloc,
106113
zend_mm_test_observer_free,
107114
zend_mm_test_observer_realloc,
108-
zend_mm_test_observer_gc
115+
zend_mm_test_observer_gc,
116+
zend_mm_test_observer_shutdown
109117
);
110118
printf("ZendMM Observer enabled\n");
111119
fflush(stdout);
@@ -121,4 +129,3 @@ void zend_test_mm_observer_rshutdown(void)
121129
}
122130
ZT_G(observer) = NULL;
123131
}
124-

0 commit comments

Comments
 (0)