ResultCode timedWaitConditionVariable()

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;
}