Skip to content

Commit 8fa36be

Browse files
Add shutdown observer and fix debug builds
1 parent 70bdf69 commit 8fa36be

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
@@ -206,11 +206,23 @@ struct _zend_mm_observer {
206206
void (*malloc)(size_t len, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
207207
void (*free)(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
208208
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);
210211
zend_mm_observer *next;
211212
};
212213

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, ...) \
214226
if (use_custom_heap & ZEND_MM_CUSTOM_HEAP_OBSERVED) { \
215227
zend_mm_observer *current = heap->observers; \
216228
while (current != NULL) { \
@@ -1989,7 +2001,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
19892001
#if ZEND_MM_CUSTOM
19902002
int use_custom_heap = heap->use_custom_heap;
19912003
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);
19932005
return 0;
19942006
}
19952007
#endif
@@ -2089,7 +2101,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
20892101
} while (chunk != heap->main_chunk);
20902102

20912103
#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);
20932105
#endif
20942106

20952107
return collected * ZEND_MM_PAGE_SIZE;
@@ -2297,8 +2309,12 @@ void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
22972309
zend_mm_huge_list *list;
22982310

22992311
#if ZEND_MM_CUSTOM
2312+
int use_custom_heap = heap->use_custom_heap;
2313+
2314+
HANDLE_NO_DEBUG_OBSERVERS(shutdown, full, silent)
23002315
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) {
23022318
if (heap->custom_heap.std._malloc == tracked_malloc) {
23032319
if (silent) {
23042320
tracked_free_all();
@@ -2314,7 +2330,7 @@ void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
23142330
}
23152331

23162332
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) {
23182334
heap->custom_heap.debug._free(heap ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC);
23192335
} else {
23202336
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
25342550
// no custom memory manager, only observer present
25352551
ptr = zend_mm_alloc_heap(AG(mm_heap), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
25362552
}
2537-
HANDLE_OBSERVERS(heap, use_custom_heap, malloc, size, ptr)
2553+
HANDLE_OBSERVERS(malloc, size, ptr)
25382554
return ptr;
25392555
}
25402556

@@ -2543,7 +2559,7 @@ static ZEND_COLD void ZEND_FASTCALL _efree_custom(void *ptr ZEND_FILE_LINE_DC ZE
25432559
zend_mm_heap *heap = AG(mm_heap);
25442560
int use_custom_heap = heap->use_custom_heap;
25452561

2546-
HANDLE_OBSERVERS(heap, use_custom_heap, free, ptr)
2562+
HANDLE_OBSERVERS(free, ptr)
25472563

25482564
if (ZEND_DEBUG && use_custom_heap & ZEND_MM_CUSTOM_HEAP_DEBUG) {
25492565
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
25682584
// no custom memory manager, only observer present
25692585
new_ptr = zend_mm_realloc_heap(AG(mm_heap), ptr, size, 0, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
25702586
}
2571-
HANDLE_OBSERVERS(heap, use_custom_heap, realloc, ptr, size, new_ptr)
2587+
HANDLE_OBSERVERS(realloc, ptr, size, new_ptr)
25722588
return new_ptr;
25732589
}
25742590
#endif
@@ -3108,7 +3124,8 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
31083124
void (*malloc)(size_t len, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
31093125
void (*free)(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
31103126
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)
31123129
) {
31133130
#if ZEND_MM_CUSTOM
31143131
if (!heap) {
@@ -3121,6 +3138,7 @@ ZEND_API zend_mm_observer* zend_mm_observer_register(
31213138
node->free = free;
31223139
node->realloc = realloc;
31233140
node->gc = gc;
3141+
node->shutdown = shutdown;
31243142
node->next = NULL;
31253143

31263144
// 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)