forked from Imagelibrary/rtems
score: Fix initialization of thread queue context
Set Thread_queue_Context::timeout_absolute in
_Thread_queue_Context_set_timeout_argument() to avoid using it uninitialized.
The bug was introduced by a89ecaa1a9.
This commit is contained in:
@@ -201,18 +201,24 @@ _Thread_queue_Context_set_timeout_ticks(
|
|||||||
/**
|
/**
|
||||||
* @brief Sets the timeout argument in the thread queue context.
|
* @brief Sets the timeout argument in the thread queue context.
|
||||||
*
|
*
|
||||||
* @param[out] queue_context The thread queue context.
|
* @param[out] queue_context is the thread queue context.
|
||||||
* @param arg The timeout argument.
|
*
|
||||||
|
* @param arg is the timeout argument.
|
||||||
|
*
|
||||||
|
* @param absolute is true, if the timeout shall be absolute, otherwise it
|
||||||
|
* shall be relative to the current time of the clock.
|
||||||
*
|
*
|
||||||
* @see _Thread_queue_Enqueue().
|
* @see _Thread_queue_Enqueue().
|
||||||
*/
|
*/
|
||||||
RTEMS_INLINE_ROUTINE void
|
RTEMS_INLINE_ROUTINE void
|
||||||
_Thread_queue_Context_set_timeout_argument(
|
_Thread_queue_Context_set_timeout_argument(
|
||||||
Thread_queue_Context *queue_context,
|
Thread_queue_Context *queue_context,
|
||||||
const void *arg
|
const void *arg,
|
||||||
|
bool absolute
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
queue_context->Timeout.arg = arg;
|
queue_context->Timeout.arg = arg;
|
||||||
|
queue_context->timeout_absolute = absolute;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ int _POSIX_Condition_variables_Wait_support(
|
|||||||
_Thread_queue_Context_initialize( &queue_context );
|
_Thread_queue_Context_initialize( &queue_context );
|
||||||
|
|
||||||
if ( abstime != NULL ) {
|
if ( abstime != NULL ) {
|
||||||
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime );
|
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime, true );
|
||||||
|
|
||||||
if ( _POSIX_Condition_variables_Get_clock( flags ) == CLOCK_MONOTONIC ) {
|
if ( _POSIX_Condition_variables_Get_clock( flags ) == CLOCK_MONOTONIC ) {
|
||||||
_Thread_queue_Context_set_enqueue_callout(
|
_Thread_queue_Context_set_enqueue_callout(
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ ssize_t _POSIX_Message_queue_Receive_support(
|
|||||||
}
|
}
|
||||||
|
|
||||||
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout );
|
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout );
|
||||||
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime );
|
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime, true );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now if something goes wrong, we return a "length" of -1
|
* Now if something goes wrong, we return a "length" of -1
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ int _POSIX_Message_queue_Send_support(
|
|||||||
}
|
}
|
||||||
|
|
||||||
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout );
|
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout );
|
||||||
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime );
|
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime, true );
|
||||||
|
|
||||||
_CORE_message_queue_Acquire_critical(
|
_CORE_message_queue_Acquire_critical(
|
||||||
&the_mq->Message_queue,
|
&the_mq->Message_queue,
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ int _POSIX_Mutex_Lock_support(
|
|||||||
|
|
||||||
executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
|
executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
|
||||||
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout);
|
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout);
|
||||||
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime );
|
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime, true );
|
||||||
|
|
||||||
switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
|
switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
|
||||||
case POSIX_MUTEX_PRIORITY_CEILING:
|
case POSIX_MUTEX_PRIORITY_CEILING:
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ int _Condition_Wait_timed(
|
|||||||
&context.Base,
|
&context.Base,
|
||||||
_Condition_Enqueue_with_timeout
|
_Condition_Enqueue_with_timeout
|
||||||
);
|
);
|
||||||
_Thread_queue_Context_set_timeout_argument( &context.Base, abstime );
|
_Thread_queue_Context_set_timeout_argument( &context.Base, abstime, true );
|
||||||
executing = _Condition_Do_wait( _condition, _mutex, &context );
|
executing = _Condition_Do_wait( _condition, _mutex, &context );
|
||||||
eno = STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) );
|
eno = STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) );
|
||||||
_Mutex_Acquire( _mutex );
|
_Mutex_Acquire( _mutex );
|
||||||
@@ -243,7 +243,7 @@ int _Condition_Wait_recursive_timed(
|
|||||||
&context.Base,
|
&context.Base,
|
||||||
_Condition_Enqueue_with_timeout
|
_Condition_Enqueue_with_timeout
|
||||||
);
|
);
|
||||||
_Thread_queue_Context_set_timeout_argument( &context.Base, abstime );
|
_Thread_queue_Context_set_timeout_argument( &context.Base, abstime, true );
|
||||||
nest_level = _Condition_Unnest_mutex( _mutex );
|
nest_level = _Condition_Unnest_mutex( _mutex );
|
||||||
executing = _Condition_Do_wait( _condition, &_mutex->_Mutex, &context );
|
executing = _Condition_Do_wait( _condition, &_mutex->_Mutex, &context );
|
||||||
eno = STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) );
|
eno = STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) );
|
||||||
|
|||||||
Reference in New Issue
Block a user