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; 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. * @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( RTEMS_INLINE_ROUTINE void _Thread_Timer_initialize(
Thread_Timer_information *timer, Thread_Timer_information *timer,

View File

@@ -22,15 +22,12 @@
#include <rtems/score/threadimpl.h> #include <rtems/score/threadimpl.h>
#include <rtems/score/status.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_queue_Context queue_context;
Thread_Wait_flags wait_flags; Thread_Wait_flags wait_flags;
bool unblock; bool unblock;
the_thread = RTEMS_CONTAINER_OF( watchdog, Thread_Control, Timer.Watchdog );
_Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_initialize( &queue_context );
_Thread_queue_Context_clear_priority_updates( &queue_context ); _Thread_queue_Context_clear_priority_updates( &queue_context );
_Thread_Wait_acquire( the_thread, &queue_context ); _Thread_Wait_acquire( the_thread, &queue_context );
@@ -44,7 +41,7 @@ void _Thread_Timeout( Watchdog_Control *watchdog )
_Thread_Wait_cancel( the_thread, &queue_context ); _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; wait_class = wait_flags & THREAD_WAIT_CLASS_MASK;
ready_again = wait_class | THREAD_WAIT_STATE_READY_AGAIN; ready_again = wait_class | THREAD_WAIT_STATE_READY_AGAIN;
@@ -82,3 +79,15 @@ void _Thread_Timeout( Watchdog_Control *watchdog )
#endif #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 );
}