[PATCH 2/4] score: Remove idle field of Per_CPU_Control
Gedare Bloom
gedare at rtems.org
Wed May 29 16:26:06 UTC 2013
I don't like the names of _Thread_Set_exit_status() and
_Thread_Get_exit_status(). They are misleading because there is no
such thing as a thread's "exit_status". The only thing they have to do
with Thread Manager is that the Idle thread holds the shutdown state
in its return_code. It might be better to create
_Thread_Set/Get_return_code() and pass it
rtems_configuration_get_idle(). These Setter/Getter functions could
also be used to improve readability in other parts where the
return_code of a thread is read/written.
-Gedare
On Wed, May 29, 2013 at 11:31 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> This field is unused except for special case simulator clock drivers.
> In these places use an alternative. Add and use
> _Thread_Set_exit_status() and _Thread_Get_exit_status().
> ---
> c/src/lib/libbsp/shared/clockdrv_shell.h | 7 +++++--
> c/src/lib/libcpu/bfin/clock/clock.c | 7 +++++--
> c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c | 7 +++++--
> cpukit/sapi/src/exinit.c | 4 ++--
> cpukit/sapi/src/exshutdown.c | 3 +--
> cpukit/score/include/rtems/score/percpu.h | 5 -----
> cpukit/score/inline/rtems/score/thread.inl | 16 ++++++++++++++++
> cpukit/score/src/threadcreateidle.c | 11 ++++++-----
> testsuites/sptests/spsimplesched02/init.c | 13 +++++++++++--
> 9 files changed, 51 insertions(+), 22 deletions(-)
>
> diff --git a/c/src/lib/libbsp/shared/clockdrv_shell.h b/c/src/lib/libbsp/shared/clockdrv_shell.h
> index 3e8d08c..7919261 100644
> --- a/c/src/lib/libbsp/shared/clockdrv_shell.h
> +++ b/c/src/lib/libbsp/shared/clockdrv_shell.h
> @@ -73,8 +73,11 @@ rtems_isr Clock_isr(
> #ifdef CLOCK_DRIVER_USE_FAST_IDLE
> do {
> rtems_clock_tick();
> - } while ( _Thread_Executing == _Thread_Idle &&
> - _Thread_Heir == _Thread_Executing);
> + } while (
> + _Thread_Heir == _Thread_Executing
> + && _Thread_Executing->Start.entry_point
> + == rtems_configuration_get_idle_task()
> + );
>
> Clock_driver_support_at_tick();
> return;
> diff --git a/c/src/lib/libcpu/bfin/clock/clock.c b/c/src/lib/libcpu/bfin/clock/clock.c
> index 530e5ba..4652586 100644
> --- a/c/src/lib/libcpu/bfin/clock/clock.c
> +++ b/c/src/lib/libcpu/bfin/clock/clock.c
> @@ -39,8 +39,11 @@ static rtems_isr clockISR(rtems_vector_number vector) {
> #ifdef CLOCK_DRIVER_USE_FAST_IDLE
> do {
> rtems_clock_tick();
> - } while (_Thread_Executing == _Thread_Idle &&
> - _Thread_Heir == _Thread_Executing);
> + } while (
> + _Thread_Heir == _Thread_Executing
> + && _Thread_Executing->Start.entry_point
> + == rtems_configuration_get_idle_task()
> + );
> #else
> rtems_clock_tick();
> #endif
> diff --git a/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c b/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
> index 01b72aa..3033b70 100644
> --- a/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
> +++ b/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
> @@ -98,8 +98,11 @@ static void clockHandler(void)
> #if (CLOCK_DRIVER_USE_FAST_IDLE == 1)
> do {
> rtems_clock_tick();
> - } while ( _Thread_Executing == _Thread_Idle &&
> - _Thread_Heir == _Thread_Executing);
> + } while (
> + _Thread_Heir == _Thread_Executing
> + && _Thread_Executing->Start.entry_point
> + == rtems_configuration_get_idle_task()
> + );
>
> #else
> rtems_clock_tick();
> diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
> index 4ee2471..a0203eb 100644
> --- a/cpukit/sapi/src/exinit.c
> +++ b/cpukit/sapi/src/exinit.c
> @@ -237,7 +237,7 @@ void rtems_initialize_start_multitasking(void)
> *******************************************************************
> *******************************************************************
> *******************************************************************/
> -
> - status = _Per_CPU_Information[0].idle->Wait.return_code;
> +
> + status = _Thread_Get_exit_status();
> rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, status );
> }
> diff --git a/cpukit/sapi/src/exshutdown.c b/cpukit/sapi/src/exshutdown.c
> index 2b99995..b81e8b5 100644
> --- a/cpukit/sapi/src/exshutdown.c
> +++ b/cpukit/sapi/src/exshutdown.c
> @@ -44,8 +44,7 @@ void rtems_shutdown_executive(
> _SMP_Request_other_cores_to_shutdown();
> #endif
>
> - _Per_CPU_Information[0].idle->Wait.return_code = result;
> -
> + _Thread_Set_exit_status( result );
> _System_state_Set( SYSTEM_STATE_SHUTDOWN );
> _Thread_Stop_multitasking();
>
> diff --git a/cpukit/score/include/rtems/score/percpu.h b/cpukit/score/include/rtems/score/percpu.h
> index 735b422..f545310 100644
> --- a/cpukit/score/include/rtems/score/percpu.h
> +++ b/cpukit/score/include/rtems/score/percpu.h
> @@ -162,9 +162,6 @@ typedef struct {
> /** This is the heir thread for this this CPU. */
> Thread_Control *heir;
>
> - /** This is the idle thread for this CPU. */
> - Thread_Control *idle;
> -
> /** This is the time of the last context switch on this CPU. */
> Timestamp_Control time_of_last_context_switch;
>
> @@ -283,8 +280,6 @@ void _Per_CPU_Wait_for_state(
> _Per_CPU_Information[bsp_smp_processor_id()].heir
> #define _Thread_Executing \
> _Per_CPU_Information[bsp_smp_processor_id()].executing
> -#define _Thread_Idle \
> - _Per_CPU_Information[bsp_smp_processor_id()].idle
> #define _ISR_Nest_level \
> _Per_CPU_Information[bsp_smp_processor_id()].isr_nest_level
> #define _CPU_Interrupt_stack_low \
> diff --git a/cpukit/score/inline/rtems/score/thread.inl b/cpukit/score/inline/rtems/score/thread.inl
> index 681cfcc..b089c9b 100644
> --- a/cpukit/score/inline/rtems/score/thread.inl
> +++ b/cpukit/score/inline/rtems/score/thread.inl
> @@ -344,6 +344,22 @@ RTEMS_INLINE_ROUTINE void _Thread_Internal_free (
> _Objects_Free( &_Thread_Internal_information, &the_task->Object );
> }
>
> +RTEMS_INLINE_ROUTINE void _Thread_Set_exit_status( uint32_t exit_status )
> +{
> + Thread_Control *idle = (Thread_Control *)
> + _Thread_Internal_information.local_table[ 1 ];
> +
> + idle->Wait.return_code = exit_status;
> +}
> +
> +RTEMS_INLINE_ROUTINE uint32_t _Thread_Get_exit_status( void )
> +{
> + const Thread_Control *idle = (const Thread_Control *)
> + _Thread_Internal_information.local_table[ 1 ];
> +
> + return idle->Wait.return_code;
> +}
> +
> /**
> * This routine returns the C library re-enterant pointer.
> */
> diff --git a/cpukit/score/src/threadcreateidle.c b/cpukit/score/src/threadcreateidle.c
> index a0279de..cc4282e 100644
> --- a/cpukit/score/src/threadcreateidle.c
> +++ b/cpukit/score/src/threadcreateidle.c
> @@ -40,9 +40,11 @@ static inline void _Thread_Create_idle_helper(
> int cpu
> )
> {
> - Objects_Name name;
> - Thread_Control *idle;
> + Per_CPU_Control *per_cpu;
> + Objects_Name name;
> + Thread_Control *idle;
>
> + per_cpu = &_Per_CPU_Information[ cpu ];
> name.name_u32 = name_u32;
>
> /*
> @@ -79,9 +81,8 @@ static inline void _Thread_Create_idle_helper(
> * WARNING!!! This is necessary to "kick" start the system and
> * MUST be done before _Thread_Start is invoked.
> */
> - _Per_CPU_Information[ cpu ].idle =
> - _Per_CPU_Information[ cpu ].heir =
> - _Per_CPU_Information[ cpu ].executing = idle;
> + per_cpu->heir =
> + per_cpu->executing = idle;
>
> _Thread_Start(
> idle,
> diff --git a/testsuites/sptests/spsimplesched02/init.c b/testsuites/sptests/spsimplesched02/init.c
> index 8b053b6..d4faa7a 100644
> --- a/testsuites/sptests/spsimplesched02/init.c
> +++ b/testsuites/sptests/spsimplesched02/init.c
> @@ -21,6 +21,7 @@ void ObtainRelease(bool suspendIdle);
> /*
> * Keep the names and IDs in global variables so another task can use them.
> */
> +rtems_id Idle_id;
> rtems_id Task_id[ 3 ]; /* array of task ids */
> rtems_name Task_name[ 3 ]; /* array of task names */
> rtems_name Semaphore_name[ 2 ];
> @@ -48,7 +49,7 @@ void ObtainRelease( bool suspendIdle )
>
> if (suspendIdle) {
> puts( "INIT - Suspend Idle Task");
> - status = rtems_task_suspend( _Thread_Idle->Object.id );
> + status = rtems_task_suspend( Idle_id );
> directive_failed( status, "rtems_task_suspend idle" );
> }
>
> @@ -62,7 +63,7 @@ void ObtainRelease( bool suspendIdle )
>
> if (suspendIdle) {
> puts( "INIT - Resume Idle Task");
> - status = rtems_task_resume( _Thread_Idle->Object.id );
> + status = rtems_task_resume( Idle_id );
> directive_failed( status, "rtems_task_resume idle" );
> }
> }
> @@ -75,6 +76,14 @@ rtems_task Init(
>
> puts( "\n\n*** SIMPLE SCHEDULER 02 TEST ***" );
>
> + status = _Objects_Name_to_id_u32(
> + &_Thread_Internal_information,
> + rtems_build_name( 'I', 'D', 'L', 'E' ),
> + RTEMS_SEARCH_LOCAL_NODE,
> + &Idle_id
> + );
> + rtems_test_assert( status == RTEMS_SUCCESSFUL );
> +
> /*
> * Create the semaphore. Then obtain and release the
> * semaphore with no other tasks running.
> --
> 1.7.7
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
More information about the devel
mailing list