in agent/native/ext/platform_threads_linux.cpp [431:477]
ResultCode timedWaitConditionVariable( ConditionVariable* condVar
, Mutex* mtx
, const TimeSpec* timeoutAbsUtc
, /* out */ bool* hasTimedOut
, String dbgDesc )
{
ELASTIC_APM_ASSERT_VALID_PTR( condVar );
ELASTIC_APM_ASSERT_VALID_PTR( mtx );
ELASTIC_APM_ASSERT_VALID_PTR( hasTimedOut );
char txtOutStreamBuf[ ELASTIC_APM_TEXT_OUTPUT_STREAM_ON_STACK_BUFFER_SIZE ];
TextOutputStream txtOutStream = ELASTIC_APM_TEXT_OUTPUT_STREAM_FROM_STATIC_BUFFER( txtOutStreamBuf );
ELASTIC_APM_LOG_TRACE_FUNCTION_ENTRY_MSG(
"Wait on condition variable with timeout"
"; timeoutAbsUtc: %s; condition variable address: %p, dbg desc: `%s'; call dbg desc: `%s'"
, streamUtcTimeSpecAsLocal( timeoutAbsUtc, &txtOutStream ), condVar, condVar->dbgDesc, dbgDesc );
int pthreadResultCode;
pthreadResultCode = pthread_cond_timedwait( &( condVar->conditionVariable ), &( mtx->mutex ), timeoutAbsUtc );
if ( pthreadResultCode == 0 )
{
*hasTimedOut = false;
}
else if ( pthreadResultCode == ETIMEDOUT )
{
*hasTimedOut = true;
}
else
{
ELASTIC_APM_LOG_ERROR(
"pthread_cond_timedwait failed with error: `%s'"
"; timeoutAbsUtc: %s; condition variable address: %p, dbg desc: `%s'; call dbg desc: `%s'"
, streamErrNo( pthreadResultCode, &txtOutStream )
, streamUtcTimeSpecAsLocal( timeoutAbsUtc, &txtOutStream ), condVar, condVar->dbgDesc, dbgDesc );
return resultFailure;
}
ELASTIC_APM_LOG_TRACE_FUNCTION_EXIT_MSG(
"Wait on condition variable with timeout"
"; hasTimedOut: %s"
"; timeoutAbsUtc: %s; condition variable address: %p, dbg desc: `%s'; call dbg desc: `%s'"
, boolToString( *hasTimedOut )
, streamUtcTimeSpecAsLocal( timeoutAbsUtc, &txtOutStream ), condVar, condVar->dbgDesc, dbgDesc );
return resultSuccess;
}