in agent/native/ext/backend_comm.cpp [975:1032]
ResultCode unwindBackgroundBackendComm( BackgroundBackendComm** backgroundBackendCommOutPtr, const TimeSpec* timeoutAbsUtc, bool isCreatedByThisProcess )
{
ELASTIC_APM_LOG_DEBUG_FUNCTION_ENTRY_MSG( "isCreatedByThisProcess: %s", boolToString( isCreatedByThisProcess ) );
ELASTIC_APM_ASSERT_VALID_PTR( backgroundBackendCommOutPtr );
// ELASTIC_APM_ASSERT_VALID_PTR( timeoutAbsUtc ); <- timeoutAbsUtc can be NULL
ResultCode resultCode;
BackgroundBackendComm* backgroundBackendComm = *backgroundBackendCommOutPtr;
if ( backgroundBackendComm == NULL )
{
resultCode = resultSuccess;
goto finally;
}
if ( ! isCreatedByThisProcess )
{
ELASTIC_APM_LOG_DEBUG( "Deallocating memory related to background communication data structures inherited from parent process after fork"
" without actually properly destroying synchronization primitives since it's impossible to do in child process"
"; parent PID: %d"
, (int)getParentProcessId() );
}
if ( backgroundBackendComm->thread != NULL )
{
void* backgroundBackendCommThreadFuncRetVal = NULL;
bool hasTimedOut;
ELASTIC_APM_CALL_IF_FAILED_GOTO(
timedJoinAndDeleteThread( &( backgroundBackendComm->thread ), &backgroundBackendCommThreadFuncRetVal, timeoutAbsUtc, isCreatedByThisProcess, &hasTimedOut, __FUNCTION__ ) );
if ( hasTimedOut )
{
ELASTIC_APM_LOG_ERROR( "Join to thread for background backend communications timed out - skipping the rest of cleanup and exiting" );
ELASTIC_APM_SET_RESULT_CODE_AND_GOTO_FAILURE();
}
}
if ( backgroundBackendComm->condVar != NULL )
{
ELASTIC_APM_CALL_IF_FAILED_GOTO( deleteConditionVariable( &( backgroundBackendComm->condVar ), isCreatedByThisProcess ) );
}
if ( backgroundBackendComm->mutex != NULL )
{
ELASTIC_APM_CALL_IF_FAILED_GOTO( deleteMutex( &( backgroundBackendComm->mutex ) ) );
}
resultCode = resultSuccess;
freeDataToSendQueue( &( backgroundBackendComm->dataToSendQueue ) );
ELASTIC_APM_FREE_INSTANCE_AND_SET_TO_NULL( BackgroundBackendComm, *backgroundBackendCommOutPtr );
finally:
ELASTIC_APM_LOG_DEBUG_RESULT_CODE_FUNCTION_EXIT();
return resultCode;
failure:
goto finally;
}