Skip to content

Commit 848b545

Browse files
authored
more fiber notifications (#7293)
1 parent 9f18bff commit 848b545

File tree

6 files changed

+69
-0
lines changed

6 files changed

+69
-0
lines changed

Zend/zend_fibers.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,11 +345,15 @@ ZEND_API bool zend_fiber_init_context(zend_fiber_context *context, void *kind, z
345345
// Set status in case memory has not been zeroed.
346346
context->status = ZEND_FIBER_STATUS_INIT;
347347

348+
zend_observer_fiber_init_notify(context);
349+
348350
return true;
349351
}
350352

351353
ZEND_API void zend_fiber_destroy_context(zend_fiber_context *context)
352354
{
355+
zend_observer_fiber_destroy_notify(context);
356+
353357
zend_fiber_stack_free(context->stack);
354358
}
355359

Zend/zend_observer.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ typedef struct _zend_observer_fcall_data {
4040

4141
zend_llist zend_observers_fcall_list;
4242
zend_llist zend_observer_error_callbacks;
43+
zend_llist zend_observer_fiber_init;
4344
zend_llist zend_observer_fiber_switch;
45+
zend_llist zend_observer_fiber_destroy;
4446

4547
int zend_observer_fcall_op_array_extension = -1;
4648

@@ -73,7 +75,9 @@ ZEND_API void zend_observer_fcall_register(zend_observer_fcall_init init) {
7375
ZEND_API void zend_observer_startup(void) {
7476
zend_llist_init(&zend_observers_fcall_list, sizeof(zend_observer_fcall_init), NULL, 1);
7577
zend_llist_init(&zend_observer_error_callbacks, sizeof(zend_observer_error_cb), NULL, 1);
78+
zend_llist_init(&zend_observer_fiber_init, sizeof(zend_observer_fiber_init_handler), NULL, 1);
7679
zend_llist_init(&zend_observer_fiber_switch, sizeof(zend_observer_fiber_switch_handler), NULL, 1);
80+
zend_llist_init(&zend_observer_fiber_destroy, sizeof(zend_observer_fiber_destroy_handler), NULL, 1);
7781
}
7882

7983
ZEND_API void zend_observer_activate(void) {
@@ -259,11 +263,32 @@ void zend_observer_error_notify(int type, zend_string *error_filename, uint32_t
259263
}
260264
}
261265

266+
ZEND_API void zend_observer_fiber_init_register(zend_observer_fiber_init_handler handler)
267+
{
268+
zend_llist_add_element(&zend_observer_fiber_init, &handler);
269+
}
270+
262271
ZEND_API void zend_observer_fiber_switch_register(zend_observer_fiber_switch_handler handler)
263272
{
264273
zend_llist_add_element(&zend_observer_fiber_switch, &handler);
265274
}
266275

276+
ZEND_API void zend_observer_fiber_destroy_register(zend_observer_fiber_destroy_handler handler)
277+
{
278+
zend_llist_add_element(&zend_observer_fiber_destroy, &handler);
279+
}
280+
281+
ZEND_API void ZEND_FASTCALL zend_observer_fiber_init_notify(zend_fiber_context *initializing)
282+
{
283+
zend_llist_element *element;
284+
zend_observer_fiber_init_handler callback;
285+
286+
for (element = zend_observer_fiber_init.head; element; element = element->next) {
287+
callback = *(zend_observer_fiber_init_handler *) element->data;
288+
callback(initializing);
289+
}
290+
}
291+
267292
ZEND_API void ZEND_FASTCALL zend_observer_fiber_switch_notify(zend_fiber_context *from, zend_fiber_context *to)
268293
{
269294
zend_llist_element *element;
@@ -274,3 +299,14 @@ ZEND_API void ZEND_FASTCALL zend_observer_fiber_switch_notify(zend_fiber_context
274299
callback(from, to);
275300
}
276301
}
302+
303+
ZEND_API void ZEND_FASTCALL zend_observer_fiber_destroy_notify(zend_fiber_context *destroying)
304+
{
305+
zend_llist_element *element;
306+
zend_observer_fiber_destroy_handler callback;
307+
308+
for (element = zend_observer_fiber_destroy.head; element; element = element->next) {
309+
callback = *(zend_observer_fiber_destroy_handler *) element->data;
310+
callback(destroying);
311+
}
312+
}

Zend/zend_observer.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,17 @@ typedef void (*zend_observer_error_cb)(int type, zend_string *error_filename, ui
7878
ZEND_API void zend_observer_error_register(zend_observer_error_cb callback);
7979
void zend_observer_error_notify(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message);
8080

81+
typedef void (*zend_observer_fiber_init_handler)(zend_fiber_context *initializing);
8182
typedef void (*zend_observer_fiber_switch_handler)(zend_fiber_context *from, zend_fiber_context *to);
83+
typedef void (*zend_observer_fiber_destroy_handler)(zend_fiber_context *destroying);
8284

85+
ZEND_API void zend_observer_fiber_init_register(zend_observer_fiber_init_handler handler);
8386
ZEND_API void zend_observer_fiber_switch_register(zend_observer_fiber_switch_handler handler);
87+
ZEND_API void zend_observer_fiber_destroy_register(zend_observer_fiber_destroy_handler handler);
88+
89+
ZEND_API void ZEND_FASTCALL zend_observer_fiber_init_notify(zend_fiber_context *initializing);
8490
ZEND_API void ZEND_FASTCALL zend_observer_fiber_switch_notify(zend_fiber_context *from, zend_fiber_context *to);
91+
ZEND_API void ZEND_FASTCALL zend_observer_fiber_destroy_notify(zend_fiber_context *destroying);
8592

8693
END_EXTERN_C()
8794

ext/zend_test/observer.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,18 @@ static zend_observer_fcall_handlers observer_fcall_init(zend_execute_data *execu
189189
return (zend_observer_fcall_handlers){NULL, NULL};
190190
}
191191

192+
static void fiber_init_observer(zend_fiber_context *initializing) {
193+
if (ZT_G(observer_fiber_init)) {
194+
php_printf("<!-- alloc: %p -->\n", initializing);
195+
}
196+
}
197+
198+
static void fiber_destroy_observer(zend_fiber_context *destroying) {
199+
if (ZT_G(observer_fiber_destroy)) {
200+
php_printf("<!-- destroy: %p -->\n", destroying);
201+
}
202+
}
203+
192204
static void fiber_address_observer(zend_fiber_context *from, zend_fiber_context *to)
193205
{
194206
if (ZT_G(observer_fiber_switch)) {
@@ -249,7 +261,9 @@ PHP_INI_BEGIN()
249261
STD_PHP_INI_BOOLEAN("zend_test.observer.show_init_backtrace", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_show_init_backtrace, zend_zend_test_globals, zend_test_globals)
250262
STD_PHP_INI_BOOLEAN("zend_test.observer.show_opcode", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_show_opcode, zend_zend_test_globals, zend_test_globals)
251263
STD_PHP_INI_ENTRY("zend_test.observer.show_opcode_in_user_handler", "", PHP_INI_SYSTEM, OnUpdateString, observer_show_opcode_in_user_handler, zend_zend_test_globals, zend_test_globals)
264+
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_init", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_init, zend_zend_test_globals, zend_test_globals)
252265
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_switch", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_switch, zend_zend_test_globals, zend_test_globals)
266+
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_destroy", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_destroy, zend_zend_test_globals, zend_test_globals)
253267
PHP_INI_END()
254268

255269
void zend_test_observer_init(INIT_FUNC_ARGS)
@@ -269,9 +283,11 @@ void zend_test_observer_init(INIT_FUNC_ARGS)
269283
}
270284

271285
if (ZT_G(observer_enabled)) {
286+
zend_observer_fiber_init_register(fiber_init_observer);
272287
zend_observer_fiber_switch_register(fiber_address_observer);
273288
zend_observer_fiber_switch_register(fiber_enter_observer);
274289
zend_observer_fiber_switch_register(fiber_suspend_observer);
290+
zend_observer_fiber_destroy_register(fiber_destroy_observer);
275291
}
276292
}
277293

ext/zend_test/php_test.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test)
4444
int observer_show_opcode;
4545
char *observer_show_opcode_in_user_handler;
4646
int observer_nesting_depth;
47+
int observer_fiber_init;
4748
int observer_fiber_switch;
49+
int observer_fiber_destroy;
4850
int replace_zend_execute_ex;
4951
int register_passes;
5052
zend_test_fiber *active_fiber;

ext/zend_test/tests/observer_fiber_01.phpt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ Observer: Basic fiber switching
44
zend_test
55
--INI--
66
zend_test.observer.enabled=1
7+
zend_test.observer.fiber_init=1
78
zend_test.observer.fiber_switch=1
9+
zend_test.observer.fiber_destroy=1
810
--FILE--
911
<?php
1012

@@ -18,6 +20,7 @@ $fiber->resume();
1820
?>
1921
--EXPECTF--
2022
<!-- init '%sobserver_fiber_01.php' -->
23+
<!-- alloc: %s -->
2124
<!-- switching from fiber %s to %s -->
2225
<init '%s'>
2326
<!-- init {closure}() -->
@@ -27,3 +30,4 @@ $fiber->resume();
2730
<resume '%s'>
2831
<!-- switching from fiber %s to %s -->
2932
<returned '%s'>
33+
<!-- destroy: %s -->

0 commit comments

Comments
 (0)