mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-21 04:29:11 +08:00
rtems: Add signal post switch extension on the fly
This commit is contained in:
@@ -25,8 +25,50 @@
|
||||
#include <rtems/rtems/modes.h>
|
||||
#include <rtems/rtems/signal.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/apiext.h>
|
||||
#include <rtems/rtems/tasks.h>
|
||||
|
||||
static void _RTEMS_signal_Post_switch_hook( Thread_Control *executing )
|
||||
{
|
||||
ISR_Level level;
|
||||
RTEMS_API_Control *api;
|
||||
ASR_Information *asr;
|
||||
rtems_signal_set signal_set;
|
||||
Modes_Control prev_mode;
|
||||
|
||||
api = executing->API_Extensions[ THREAD_API_RTEMS ];
|
||||
if ( !api )
|
||||
return;
|
||||
|
||||
/*
|
||||
* Signal Processing
|
||||
*/
|
||||
|
||||
asr = &api->Signal;
|
||||
|
||||
_ISR_Disable( level );
|
||||
signal_set = asr->signals_posted;
|
||||
asr->signals_posted = 0;
|
||||
_ISR_Enable( level );
|
||||
|
||||
|
||||
if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
|
||||
return;
|
||||
|
||||
asr->nest_level += 1;
|
||||
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
|
||||
|
||||
(*asr->handler)( signal_set );
|
||||
|
||||
asr->nest_level -= 1;
|
||||
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
|
||||
|
||||
}
|
||||
|
||||
static API_extensions_Post_switch_control _RTEMS_signal_Post_switch = {
|
||||
.hook = _RTEMS_signal_Post_switch_hook
|
||||
};
|
||||
|
||||
rtems_status_code rtems_signal_catch(
|
||||
rtems_asr_entry asr_handler,
|
||||
rtems_mode mode_set
|
||||
@@ -44,6 +86,8 @@ rtems_status_code rtems_signal_catch(
|
||||
_Thread_Disable_dispatch(); /* cannot reschedule while */
|
||||
/* the thread is inconsistent */
|
||||
|
||||
_API_extensions_Add_post_switch( &_RTEMS_signal_Post_switch );
|
||||
|
||||
if ( !_ASR_Is_null_handler( asr_handler ) ) {
|
||||
asr->mode_set = mode_set;
|
||||
asr->handler = asr_handler;
|
||||
|
||||
@@ -167,51 +167,6 @@ static void _RTEMS_tasks_Switch_extension(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* _RTEMS_tasks_Post_switch_extension
|
||||
*
|
||||
* This extension routine is invoked at each context switch.
|
||||
*/
|
||||
|
||||
static void _RTEMS_tasks_Post_switch_extension(
|
||||
Thread_Control *executing
|
||||
)
|
||||
{
|
||||
ISR_Level level;
|
||||
RTEMS_API_Control *api;
|
||||
ASR_Information *asr;
|
||||
rtems_signal_set signal_set;
|
||||
Modes_Control prev_mode;
|
||||
|
||||
api = executing->API_Extensions[ THREAD_API_RTEMS ];
|
||||
if ( !api )
|
||||
return;
|
||||
|
||||
/*
|
||||
* Signal Processing
|
||||
*/
|
||||
|
||||
asr = &api->Signal;
|
||||
|
||||
_ISR_Disable( level );
|
||||
signal_set = asr->signals_posted;
|
||||
asr->signals_posted = 0;
|
||||
_ISR_Enable( level );
|
||||
|
||||
|
||||
if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
|
||||
return;
|
||||
|
||||
asr->nest_level += 1;
|
||||
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
|
||||
|
||||
(*asr->handler)( signal_set );
|
||||
|
||||
asr->nest_level -= 1;
|
||||
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
|
||||
|
||||
}
|
||||
|
||||
API_extensions_Control _RTEMS_tasks_API_extensions = {
|
||||
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
|
||||
.predriver_hook = NULL,
|
||||
@@ -219,10 +174,6 @@ API_extensions_Control _RTEMS_tasks_API_extensions = {
|
||||
.postdriver_hook = _RTEMS_tasks_Initialize_user_tasks
|
||||
};
|
||||
|
||||
API_extensions_Post_switch_control _RTEMS_tasks_API_extensions_post_switch = {
|
||||
.hook = _RTEMS_tasks_Post_switch_extension
|
||||
};
|
||||
|
||||
User_extensions_Control _RTEMS_tasks_User_extensions = {
|
||||
{ NULL, NULL },
|
||||
{ { NULL, NULL }, _RTEMS_tasks_Switch_extension },
|
||||
@@ -262,7 +213,6 @@ void _RTEMS_tasks_Manager_initialization(void)
|
||||
_User_extensions_Add_API_set( &_RTEMS_tasks_User_extensions );
|
||||
|
||||
_API_extensions_Add( &_RTEMS_tasks_API_extensions );
|
||||
_API_extensions_Add_post_switch( &_RTEMS_tasks_API_extensions_post_switch );
|
||||
|
||||
/*
|
||||
* Register the MP Process Packet routine.
|
||||
|
||||
Reference in New Issue
Block a user