Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0f367e0

Browse files
Add shutdown observer and fix debug builds
1 parent f26c510 commit 0f367e0

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)

AltStyle によって変換されたページ (->オリジナル) /