Separate task mode checks

Update #3000.
This commit is contained in:
Sebastian Huber
2019-01-09 10:35:24 +01:00
parent feddcde09a
commit 38cb59ee0b
2 changed files with 26 additions and 23 deletions
+15 -15
View File
@@ -43,22 +43,22 @@ rtems_status_code rtems_task_mode(
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
#if defined( RTEMS_SMP )
/*
* When in SMP, you cannot disable preemption for a thread or
* alter its interrupt level. It must be fully preemptible with
* all interrupts enabled.
*/
if ( rtems_configuration_is_smp_enabled() ) {
if ( mask & RTEMS_PREEMPT_MASK ) {
if ( !_Modes_Is_preempt( mode_set ) ) {
return RTEMS_NOT_IMPLEMENTED;
}
}
#if defined(RTEMS_SMP)
if (
( mask & RTEMS_PREEMPT_MASK ) != 0
&& !_Modes_Is_preempt( mode_set )
&& rtems_configuration_is_smp_enabled()
) {
return RTEMS_NOT_IMPLEMENTED;
}
#endif
if ( mask & RTEMS_INTERRUPT_MASK ) {
return RTEMS_NOT_IMPLEMENTED;
}
#if defined(RTEMS_SMP)
if (
( mask & RTEMS_INTERRUPT_MASK ) != 0
&& rtems_configuration_is_smp_enabled()
) {
return RTEMS_NOT_IMPLEMENTED;
}
#endif
+11 -8
View File
@@ -58,15 +58,18 @@ bool _Thread_Initialize(
size_t scheduler_index;
Per_CPU_Control *cpu = _Per_CPU_Get_by_index( 0 );
#if defined( RTEMS_SMP )
if ( rtems_configuration_is_smp_enabled() ) {
if ( !is_preemptible ) {
return false;
}
#if defined(RTEMS_SMP)
if ( !is_preemptible && rtems_configuration_is_smp_enabled() ) {
return false;
}
#endif
if ( isr_level != 0 ) {
return false;
}
#if defined(RTEMS_SMP)
if (
isr_level != 0
&& rtems_configuration_is_smp_enabled()
) {
return false;
}
#endif