score: Add _Thread_Continue()

Update #3117.
Update #3182.
This commit is contained in:
Sebastian Huber
2017-10-19 13:41:25 +02:00
parent 5747962909
commit 6de1f92121
2 changed files with 33 additions and 10 deletions

View File

@@ -1840,12 +1840,26 @@ RTEMS_INLINE_ROUTINE Status_Control _Thread_Wait_get_status(
return (Status_Control) the_thread->Wait.return_code;
}
/**
* @brief Cancels a blocking operation so that the thread can continue its
* execution.
*
* In case this function actually cancelled the blocking operation, then the
* thread wait return code is set to the specified status.
*
* A specialization of this function is _Thread_Timeout().
*
* @param[in] the_thread The thread.
* @param[in] status The thread wait status.
*/
void _Thread_Continue( Thread_Control *the_thread, Status_Control status );
/**
* @brief General purpose thread wait timeout.
*
* @param[in] watchdog The thread timer watchdog.
* @param[in] the_watchdog The thread timer watchdog.
*/
void _Thread_Timeout( Watchdog_Control *watchdog );
void _Thread_Timeout( Watchdog_Control *the_watchdog );
RTEMS_INLINE_ROUTINE void _Thread_Timer_initialize(
Thread_Timer_information *timer,

View File

@@ -22,14 +22,11 @@
#include <rtems/score/threadimpl.h>
#include <rtems/score/status.h>
void _Thread_Timeout( Watchdog_Control *watchdog )
void _Thread_Continue( Thread_Control *the_thread, Status_Control status )
{
Thread_Control *the_thread;
Thread_queue_Context queue_context;
Thread_Wait_flags wait_flags;
bool unblock;
the_thread = RTEMS_CONTAINER_OF( watchdog, Thread_Control, Timer.Watchdog );
Thread_queue_Context queue_context;
Thread_Wait_flags wait_flags;
bool unblock;
_Thread_queue_Context_initialize( &queue_context );
_Thread_queue_Context_clear_priority_updates( &queue_context );
@@ -44,7 +41,7 @@ void _Thread_Timeout( Watchdog_Control *watchdog )
_Thread_Wait_cancel( the_thread, &queue_context );
the_thread->Wait.return_code = STATUS_TIMEOUT;
the_thread->Wait.return_code = status;
wait_class = wait_flags & THREAD_WAIT_CLASS_MASK;
ready_again = wait_class | THREAD_WAIT_STATE_READY_AGAIN;
@@ -82,3 +79,15 @@ void _Thread_Timeout( Watchdog_Control *watchdog )
#endif
}
}
void _Thread_Timeout( Watchdog_Control *the_watchdog )
{
Thread_Control *the_thread;
the_thread = RTEMS_CONTAINER_OF(
the_watchdog,
Thread_Control,
Timer.Watchdog
);
_Thread_Continue( the_thread, STATUS_TIMEOUT );
}