Skip to content

Commit 6a46a5d

Browse files
ZNeumannlavarou
authored andcommitted
fixup
1 parent 0e35b01 commit 6a46a5d

File tree

5 files changed

+173
-75
lines changed

5 files changed

+173
-75
lines changed

agent/php_observer.c

Lines changed: 81 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,55 @@ static zend_observer_fcall_handlers nr_php_fcall_register_handlers(
8787
handlers.end = nr_php_observer_fcall_end;
8888
return handlers;
8989
}
90+
9091
#else
92+
93+
static zend_observer_fcall_begin_handler nr_php_observer_determine_begin_handler(nruserfn_t* wraprec) {
94+
zend_observer_fcall_begin_handler begin = NULL;
95+
96+
if (NULL == wraprec) {
97+
if (NRINI(tt_detail)) {
98+
begin = nr_php_observer_fcall_begin;
99+
} else {
100+
begin = nr_php_observer_empty_fcall_begin;
101+
}
102+
} else {
103+
if (wraprec->special_instrumentation_before) {
104+
begin = (zend_observer_fcall_begin_handler)wraprec->special_instrumentation_before;
105+
} else if (wraprec->is_names_wt_simple) {
106+
begin = nr_php_observer_fcall_begin_name_transaction;
107+
} else if (wraprec->is_transient) {
108+
begin = nr_php_observer_fcall_begin;
109+
} else {
110+
begin = nr_php_observer_fcall_begin_instrumented;
111+
}
112+
}
113+
return begin;
114+
}
115+
116+
static zend_observer_fcall_end_handler nr_php_observer_determine_end_handler(nruserfn_t* wraprec) {
117+
zend_observer_fcall_end_handler end = NULL;
118+
119+
if (NULL == wraprec) {
120+
if (NRINI(tt_detail)) {
121+
end = nr_php_observer_fcall_end;
122+
} else {
123+
end = nr_php_observer_empty_fcall_end;
124+
}
125+
} else {
126+
if (wraprec->special_instrumentation) {
127+
end = (zend_observer_fcall_end_handler)wraprec->special_instrumentation;
128+
} else if (wraprec->is_exception_handler) {
129+
end = nr_php_observer_fcall_end_exception_handler;
130+
} else if (wraprec->create_metric) {
131+
end = nr_php_observer_fcall_end_create_metric;
132+
} else {
133+
end = nr_php_observer_fcall_end;
134+
}
135+
}
136+
return end;
137+
}
138+
91139
static zend_observer_fcall_handlers nr_php_fcall_register_handlers(
92140
zend_execute_data* execute_data) {
93141
zend_observer_fcall_handlers handlers = {NULL, NULL};
@@ -103,32 +151,11 @@ static zend_observer_fcall_handlers nr_php_fcall_register_handlers(
103151
// printf("REGISTER %s\n", ZSTR_VAL(execute_data->func->common.function_name));
104152
//}
105153
wraprec = nr_php_get_wraprec(execute_data->func);
106-
if (wraprec == NULL) {
107-
if (0 == NRINI(tt_detail)) {
108-
handlers.begin = nr_php_observer_empty_fcall_begin;
109-
handlers.end = nr_php_observer_empty_fcall_end;
110-
return handlers;
111-
} else {
112-
handlers.begin = nr_php_observer_fcall_begin;
113-
handlers.end = nr_php_observer_fcall_end;
114-
return handlers;
115-
}
154+
handlers.begin = nr_php_observer_determine_begin_handler(wraprec);
155+
handlers.end = nr_php_observer_determine_end_handler(wraprec);
156+
if (wraprec) {
157+
nr_txn_force_single_count(NRPRG(txn), wraprec->supportability_metric);
116158
}
117-
handlers.begin = wraprec->special_instrumentation_before ?
118-
(zend_observer_fcall_begin_handler) wraprec->special_instrumentation_before :
119-
wraprec->is_transient ?
120-
nr_php_observer_fcall_begin :
121-
wraprec->is_names_wt_simple ?
122-
nr_php_observer_fcall_begin_name_transaction :
123-
nr_php_observer_fcall_begin_instrumented;
124-
handlers.end = wraprec->special_instrumentation ?
125-
(zend_observer_fcall_end_handler) wraprec->special_instrumentation :
126-
wraprec->is_exception_handler ?
127-
nr_php_observer_fcall_end_exception_handler :
128-
wraprec->create_metric ?
129-
nr_php_observer_fcall_end_create_metric :
130-
nr_php_observer_fcall_end;
131-
nr_txn_force_single_count(NRPRG(txn), wraprec->supportability_metric);
132159
return handlers;
133160
}
134161

@@ -143,25 +170,36 @@ bool nr_php_observer_is_registered(zend_function* func) {
143170
return (begin_handler && *begin_handler);
144171
}
145172

146-
void nr_php_observer_overwrite_handlers(zend_function* func, nruserfn_t* wraprec) {
147-
if (nr_php_observer_is_registered(func)) {
148-
if (zend_observer_remove_begin_handler(func, NRINI(tt_detail) ?
149-
nr_php_observer_fcall_begin :
150-
nr_php_observer_empty_fcall_begin)) {
151-
zend_observer_add_begin_handler(func, wraprec->special_instrumentation_before ?
152-
(zend_observer_fcall_begin_handler)wraprec->special_instrumentation_before :
153-
nr_php_observer_fcall_begin);
154-
}
155-
if (zend_observer_remove_end_handler(func, NRINI(tt_detail) ?
156-
nr_php_observer_fcall_end :
157-
nr_php_observer_empty_fcall_end)) {
158-
zend_observer_add_end_handler(func, wraprec->special_instrumentation ?
159-
(zend_observer_fcall_end_handler)wraprec->special_instrumentation :
160-
wraprec->is_exception_handler ?
161-
nr_php_observer_fcall_end_exception_handler :
162-
nr_php_observer_fcall_end);
163-
}
173+
bool nr_php_observer_remove_begin_handler(zend_function* func, nruserfn_t* wraprec) {
174+
if (!nr_php_observer_is_registered(func)) {
175+
return false;
176+
}
177+
zend_observer_fcall_begin_handler begin = nr_php_observer_determine_begin_handler(wraprec);;
178+
return zend_observer_remove_begin_handler(func, begin);
179+
}
180+
181+
bool nr_php_observer_remove_end_handler(zend_function* func, nruserfn_t* wraprec) {
182+
if (!nr_php_observer_is_registered(func)) {
183+
return false;
184+
}
185+
zend_observer_fcall_end_handler end = nr_php_observer_determine_end_handler(wraprec);
186+
return zend_observer_remove_end_handler(func, end);
187+
}
188+
189+
void nr_php_observer_add_begin_handler(zend_function* func, nruserfn_t* wraprec) {
190+
if (!nr_php_observer_is_registered(func)) {
191+
return;
192+
}
193+
zend_observer_fcall_begin_handler begin = nr_php_observer_determine_begin_handler(wraprec);;
194+
zend_observer_add_begin_handler(func, begin);
195+
}
196+
197+
void nr_php_observer_add_end_handler(zend_function* func, nruserfn_t* wraprec) {
198+
if (!nr_php_observer_is_registered(func)) {
199+
return;
164200
}
201+
zend_observer_fcall_end_handler end = nr_php_observer_determine_end_handler(wraprec);
202+
zend_observer_add_end_handler(func, end);
165203
}
166204
#endif
167205

agent/php_observer.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,15 @@ void nr_php_observer_fcall_end(zend_execute_data* execute_data,
7979

8080
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
8181
bool nr_php_observer_is_registered(zend_function* func);
82-
void nr_php_observer_overwrite_handlers(zend_function* func, nruserfn_t* wraprec);
82+
bool nr_php_observer_remove_begin_handler(zend_function* func, nruserfn_t* wraprec);
83+
bool nr_php_observer_remove_end_handler(zend_function* func, nruserfn_t* wraprec);
84+
void nr_php_observer_add_begin_handler(zend_function* func, nruserfn_t* wraprec);
85+
void nr_php_observer_add_end_handler(zend_function* func, nruserfn_t* wraprec);
8386

87+
/*
88+
* These different forms of fcall_begin and fcall_end are needed to properly utilize
89+
* the fields in a wraprec without looking it up every call.
90+
*/
8491
void nr_php_observer_empty_fcall_begin(zend_execute_data* execute_data);
8592
void nr_php_observer_fcall_begin_instrumented(zend_execute_data* execute_data);
8693
void nr_php_observer_fcall_begin_name_transaction(zend_execute_data* execute_data);

agent/php_user_instrument.c

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -254,21 +254,21 @@ static void nr_php_wrap_zend_function(zend_function* func,
254254
}
255255
}
256256

257-
static zend_function* nr_php_wrap_user_function_internal(nruserfn_t* wraprec TSRMLS_DC) {
257+
static void nr_php_wrap_user_function_internal(nruserfn_t* wraprec TSRMLS_DC) {
258258
zend_function* orig_func = 0;
259259

260260
if (0 == NR_PHP_PROCESS_GLOBALS(done_instrumentation)) {
261-
return NULL;
261+
return;
262262
}
263263

264264
if (wraprec->is_wrapped) {
265-
return NULL;
265+
return;
266266
}
267267

268268
#if ZEND_MODULE_API_NO < ZEND_8_0_X_API_NO \
269269
&& defined OVERWRITE_ZEND_EXECUTE_DATA /* PHP8+ */
270270
if (nrunlikely(-1 == NR_PHP_PROCESS_GLOBALS(zend_offset))) {
271-
return NULL;
271+
return;
272272
}
273273
#endif
274274
if (0 == wraprec->classname) {
@@ -282,8 +282,9 @@ static zend_function* nr_php_wrap_user_function_internal(nruserfn_t* wraprec TSR
282282

283283
if (NULL == orig_func) {
284284
/* It could be in a file not yet loaded, no reason to log anything. */
285-
return NULL;
285+
return;
286286
}
287+
wraprec->func = orig_func;
287288

288289
if (ZEND_USER_FUNCTION != orig_func->type) {
289290
nrl_verbosedebug(NRL_INSTRUMENT, "%s%s%s is not a user function",
@@ -295,10 +296,9 @@ static zend_function* nr_php_wrap_user_function_internal(nruserfn_t* wraprec TSR
295296
* logs with this message.
296297
*/
297298
wraprec->is_disabled = 1;
298-
return NULL;
299+
return;
299300
}
300301
nr_php_wrap_zend_function(orig_func, wraprec TSRMLS_CC);
301-
return orig_func;
302302
}
303303

304304
static nruserfn_t* nr_php_user_wraprec_create(void) {
@@ -429,6 +429,10 @@ nruserfn_t* nr_php_add_custom_tracer_callable(zend_function* func TSRMLS_DC) {
429429
nrl_verbosedebug(NRL_INSTRUMENT, "reusing custom wrapper for callable '%s'",
430430
name);
431431
nr_free(name);
432+
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
433+
nr_php_observer_remove_begin_handler(func, wraprec);
434+
nr_php_observer_remove_end_handler(func, wraprec);
435+
#endif
432436
return wraprec;
433437
}
434438

@@ -442,6 +446,10 @@ nruserfn_t* nr_php_add_custom_tracer_callable(zend_function* func TSRMLS_DC) {
442446
#if ZEND_MODULE_API_NO < ZEND_7_4_X_API_NO
443447
nr_php_add_custom_tracer_common(wraprec);
444448
#endif
449+
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
450+
nr_php_observer_remove_begin_handler(func, NULL);
451+
nr_php_observer_remove_end_handler(func, NULL);
452+
#endif
445453

446454
return wraprec;
447455
}
@@ -450,9 +458,6 @@ nruserfn_t* nr_php_add_custom_tracer_named(const char* namestr,
450458
size_t namestrlen) {
451459
nruserfn_t* wraprec;
452460
nruserfn_t* p;
453-
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
454-
zend_function* orig_func;
455-
#endif
456461

457462
wraprec = nr_php_user_wraprec_create_named(namestr, namestrlen);
458463
if (0 == wraprec) {
@@ -472,6 +477,10 @@ nruserfn_t* nr_php_add_custom_tracer_named(const char* namestr,
472477

473478
nr_php_user_wraprec_destroy(&wraprec);
474479
nr_php_wrap_user_function_internal(p TSRMLS_CC);
480+
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
481+
nr_php_observer_remove_begin_handler(p->func, wraprec);
482+
nr_php_observer_remove_end_handler(p->func, wraprec);
483+
#endif
475484
return p; /* return the wraprec we are duplicating */
476485
}
477486
p = p->next;
@@ -482,18 +491,15 @@ nruserfn_t* nr_php_add_custom_tracer_named(const char* namestr,
482491
NRP_PHP(wraprec->classname),
483492
(0 == wraprec->classname) ? "" : "::", NRP_PHP(wraprec->funcname));
484493

485-
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
486-
orig_func = nr_php_wrap_user_function_internal(wraprec TSRMLS_CC);
487-
#else
488494
nr_php_wrap_user_function_internal(wraprec TSRMLS_CC);
489-
#endif
490495
/* non-transient wraprecs are added to both the hashmap and linked list.
491496
* At request shutdown, the hashmap will free transients, but leave
492497
* non-transients to be freed when the linked list is disposed of which is at
493498
* module shutdown */
494499
nr_php_add_custom_tracer_common(wraprec);
495500
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
496-
nr_php_observer_overwrite_handlers(orig_func, wraprec);
501+
nr_php_observer_remove_begin_handler(wraprec->func, NULL);
502+
nr_php_observer_remove_end_handler(wraprec->func, NULL);
497503
#endif
498504

499505
return wraprec; /* return the new wraprec */
@@ -579,6 +585,10 @@ void nr_php_add_transaction_naming_function(const char* namestr,
579585

580586
if (NULL != wraprec) {
581587
wraprec->is_names_wt_simple = 1;
588+
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
589+
nr_php_observer_add_begin_handler(wraprec->func, wraprec);
590+
nr_php_observer_add_end_handler(wraprec->func, wraprec);
591+
#endif
582592
}
583593
}
584594

@@ -588,6 +598,10 @@ void nr_php_add_custom_tracer(const char* namestr, int namestrlen TSRMLS_DC) {
588598
if (NULL != wraprec) {
589599
wraprec->create_metric = 1;
590600
wraprec->is_user_added = 1;
601+
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
602+
nr_php_observer_add_begin_handler(wraprec->func, wraprec);
603+
nr_php_observer_add_end_handler(wraprec->func, wraprec);
604+
#endif
591605
}
592606
}
593607

@@ -596,6 +610,10 @@ void nr_php_add_exception_function(zend_function* func TSRMLS_DC) {
596610

597611
if (wraprec) {
598612
wraprec->is_exception_handler = 1;
613+
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
614+
nr_php_observer_add_begin_handler(func, wraprec);
615+
nr_php_observer_add_end_handler(func, wraprec);
616+
#endif
599617
}
600618
}
601619

@@ -651,6 +669,10 @@ void nr_php_user_function_add_declared_callback(const char* namestr,
651669
if (wraprec->is_wrapped && callback) {
652670
(callback)(TSRMLS_C);
653671
}
672+
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
673+
nr_php_observer_add_begin_handler(wraprec->func, wraprec);
674+
nr_php_observer_add_end_handler(wraprec->func, wraprec);
675+
#endif
654676
}
655677
}
656678

agent/php_user_instrument.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ typedef struct _nruserfn_t {
110110
#if ZEND_MODULE_API_NO >= ZEND_7_4_X_API_NO
111111
char* wordpress_plugin_theme;
112112
#endif
113+
#if ZEND_MODULE_API_NO >= ZEND_8_2_X_API_NO
114+
zend_function* func; /* the underlying function that this wraprec wraps */
115+
#endif
113116
} nruserfn_t;
114117

115118
extern nruserfn_t* nr_wrapped_user_functions; /* a singly linked list */

0 commit comments

Comments
 (0)