@@ -75,17 +75,23 @@ String tracerPhpPartStateToString( TracerPhpPartState value )
7575
7676static TracerPhpPartState g_tracerPhpPartState = numberOfTracerPhpPartState ;
7777
78- void switchTracerPhpPartStateToFailed ( String reason , String dbgCalledFromFunc )
78+ bool canInvokeTracerPhpPart () {
79+ return g_tracerPhpPartState == tracerPhpPartState_after_bootstrap ;
80+ }
81+
82+ // returns true if state was changed or false it was same before
83+ bool switchTracerPhpPartStateToFailed ( String reason , String dbgCalledFromFunc )
7984{
8085 if ( g_tracerPhpPartState == tracerPhpPartState_failed )
8186 {
82- return ;
87+ return false ;
8388 }
8489
8590 ELASTIC_APM_LOG_ERROR ( "Switching tracer PHP part state to failed; reason: %s, current state: %s, called from %s"
8691 , reason , tracerPhpPartStateToString ( g_tracerPhpPartState ), dbgCalledFromFunc );
8792
8893 g_tracerPhpPartState = tracerPhpPartState_failed ;
94+ return true;
8995}
9096
9197ResultCode bootstrapTracerPhpPart ( const ConfigSnapshot * config , const TimePoint * requestInitStartTime )
@@ -201,10 +207,12 @@ bool tracerPhpPartInternalFuncCallPreHook( uint32_t interceptRegistrationId, zen
201207 ZVAL_UNDEF ( & interceptRegistrationIdAsZval );
202208 zval phpPartArgs [ g_maxInterceptedCallArgsCount + 2 ];
203209
204- if ( g_tracerPhpPartState != tracerPhpPartState_after_bootstrap )
205- {
206- switchTracerPhpPartStateToFailed ( /* reason */ "Unexpected current tracer PHP part state" , __FUNCTION__ );
207- ELASTIC_APM_SET_RESULT_CODE_AND_GOTO_FAILURE ();
210+ if (!canInvokeTracerPhpPart ()) {
211+ if (switchTracerPhpPartStateToFailed ( /* reason */ "Unexpected current tracer PHP part state" , __FUNCTION__ )) {
212+ ELASTIC_APM_SET_RESULT_CODE_AND_GOTO_FAILURE ();
213+ } else {
214+ ELASTIC_APM_SET_RESULT_CODE_TO_SUCCESS_AND_GOTO_FINALLY ();
215+ }
208216 }
209217
210218 // The first argument to PHP part's interceptedCallPreHook() is $interceptRegistrationId
@@ -260,10 +268,12 @@ void tracerPhpPartInternalFuncCallPostHook( uint32_t dbgInterceptRegistrationId,
260268 ResultCode resultCode ;
261269 zval phpPartArgs [ 2 ];
262270
263- if ( g_tracerPhpPartState != tracerPhpPartState_after_bootstrap )
264- {
265- switchTracerPhpPartStateToFailed ( /* reason */ "Unexpected current tracer PHP part state" , __FUNCTION__ );
266- ELASTIC_APM_SET_RESULT_CODE_AND_GOTO_FAILURE ();
271+ if (!canInvokeTracerPhpPart ()) {
272+ if (switchTracerPhpPartStateToFailed ( /* reason */ "Unexpected current tracer PHP part state" , __FUNCTION__ )) {
273+ ELASTIC_APM_SET_RESULT_CODE_AND_GOTO_FAILURE ();
274+ } else {
275+ ELASTIC_APM_SET_RESULT_CODE_TO_SUCCESS_AND_GOTO_FINALLY ();
276+ }
267277 }
268278
269279 // The first argument to PHP part's interceptedCallPostHook() is $hasExitedByException (bool)
@@ -301,10 +311,12 @@ void tracerPhpPartInterceptedCallEmptyMethod()
301311 zval phpPartDummyArgs [ 1 ];
302312 ZVAL_UNDEF ( & ( phpPartDummyArgs [ 0 ] ) );
303313
304- if ( g_tracerPhpPartState != tracerPhpPartState_after_bootstrap )
305- {
306- switchTracerPhpPartStateToFailed ( /* reason */ "Unexpected current tracer PHP part state" , __FUNCTION__ );
307- ELASTIC_APM_SET_RESULT_CODE_AND_GOTO_FAILURE ();
314+ if (!canInvokeTracerPhpPart ()) {
315+ if (switchTracerPhpPartStateToFailed ( /* reason */ "Unexpected current tracer PHP part state" , __FUNCTION__ )) {
316+ ELASTIC_APM_SET_RESULT_CODE_AND_GOTO_FAILURE ();
317+ } else {
318+ ELASTIC_APM_SET_RESULT_CODE_TO_SUCCESS_AND_GOTO_FINALLY ();
319+ }
308320 }
309321
310322 ELASTIC_APM_CALL_IF_FAILED_GOTO (
@@ -344,18 +356,22 @@ void tracerPhpPartLogArguments( LogLevel logLevel, uint32_t argsCount, zval args
344356
345357void tracerPhpPartForwardCall ( StringView phpFuncName , zend_execute_data * execute_data , /* out */ zval * retVal , String dbgCalledFrom )
346358{
347- ResultCode resultCode ;
359+ ResultCode resultCode = resultFailure ;
360+ ZVAL_NULL (retVal );
348361 uint32_t callArgsCount ;
349362 zval callArgs [ g_maxInterceptedCallArgsCount ];
350363
351364 ELASTIC_APM_LOG_TRACE_FUNCTION_ENTRY_MSG ( "phpFuncName: %s, dbgCalledFrom: %s" , phpFuncName .begin , dbgCalledFrom );
352365
353- if ( g_tracerPhpPartState != tracerPhpPartState_after_bootstrap )
354- {
355- switchTracerPhpPartStateToFailed ( /* reason */ "Unexpected current tracer PHP part state" , __FUNCTION__ );
356- ELASTIC_APM_SET_RESULT_CODE_AND_GOTO_FAILURE ();
366+ if (!canInvokeTracerPhpPart ()) {
367+ if (switchTracerPhpPartStateToFailed ( /* reason */ "Unexpected current tracer PHP part state" , __FUNCTION__ )) {
368+ ELASTIC_APM_SET_RESULT_CODE_AND_GOTO_FAILURE ();
369+ } else {
370+ ELASTIC_APM_SET_RESULT_CODE_TO_SUCCESS_AND_GOTO_FINALLY ();
371+ }
357372 }
358373
374+
359375 getArgsFromZendExecuteData ( execute_data , g_maxInterceptedCallArgsCount , & ( callArgs [ 0 ] ), & callArgsCount );
360376 tracerPhpPartLogArguments ( logLevel_trace , callArgsCount , callArgs );
361377
@@ -385,9 +401,12 @@ void tracerPhpPartAstInstrumentationDirectCall( zend_execute_data* execute_data
385401 tracerPhpPartForwardCall ( ELASTIC_APM_STRING_LITERAL_TO_VIEW ( ELASTIC_APM_PHP_PART_AST_INSTRUMENTATION_DIRECT_CALL_FUNC ), execute_data , /* out */ & unusedRetVal , __FUNCTION__ );
386402}
387403
404+ void tracerPhpPartOnRequestInitSetInitialTracerState () {
405+ g_tracerPhpPartState = tracerPhpPartState_before_bootstrap ;
406+ }
407+
388408ResultCode tracerPhpPartOnRequestInit ( const ConfigSnapshot * config , const TimePoint * requestInitStartTime )
389409{
390- g_tracerPhpPartState = tracerPhpPartState_before_bootstrap ;
391410 return bootstrapTracerPhpPart ( config , requestInitStartTime );
392411}
393412
0 commit comments