[rtems commit] score: Initialize thread control to zero

Sebastian Huber sebh at rtems.org
Tue Dec 15 07:22:26 UTC 2015


Module:    rtems
Branch:    master
Commit:    54c3fbd63ec79d0986ecfacb9a37eb5a6fe3d264
Changeset: http://git.rtems.org/rtems/commit/?id=54c3fbd63ec79d0986ecfacb9a37eb5a6fe3d264

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Dec 11 11:09:13 2015 +0100

score: Initialize thread control to zero

This reduces the code size of the thread initialization.

---

 cpukit/posix/src/pthread.c                 | 10 ++----
 cpukit/rtems/include/rtems/rtems/asrimpl.h |  2 +-
 cpukit/rtems/src/tasks.c                   | 15 ---------
 cpukit/score/src/threadinitialize.c        | 53 +++++-------------------------
 4 files changed, 13 insertions(+), 67 deletions(-)

diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c
index 5ba2691..b8721f9 100644
--- a/cpukit/posix/src/pthread.c
+++ b/cpukit/posix/src/pthread.c
@@ -206,10 +206,8 @@ static bool _POSIX_Threads_Create_extension(
   /*
    *  POSIX 1003.1 1996, 18.2.2.2
    */
-  api->cancelation_requested = 0;
-  api->cancelability_state = PTHREAD_CANCEL_ENABLE;
-  api->cancelability_type = PTHREAD_CANCEL_DEFERRED;
-  api->last_cleanup_context = NULL;
+  RTEMS_STATIC_ASSERT( PTHREAD_CANCEL_ENABLE == 0, cancelability_state );
+  RTEMS_STATIC_ASSERT( PTHREAD_CANCEL_DEFERRED == 0, cancelability_type );
 
   /*
    *  If the thread is not a posix thread, then all posix signals are blocked
@@ -217,7 +215,7 @@ static bool _POSIX_Threads_Create_extension(
    *
    *  The check for class == 1 is debug.  Should never really happen.
    */
-  api->signals_pending = SIGNAL_EMPTY_MASK;
+  RTEMS_STATIC_ASSERT( SIGNAL_EMPTY_MASK == 0, signals_pending );
   if ( _Objects_Get_API( created->Object.id ) == OBJECTS_POSIX_API
        #if defined(RTEMS_DEBUG)
          && _Objects_Get_class( created->Object.id ) == 1
@@ -229,10 +227,8 @@ static bool _POSIX_Threads_Create_extension(
     api->signals_blocked = SIGNAL_ALL_MASK;
   }
 
-  _Thread_Action_initialize( &api->Signal_action );
   _Thread_queue_Initialize( &api->Join_List, THREAD_QUEUE_DISCIPLINE_FIFO );
 
-  _Watchdog_Preinitialize( &api->Sporadic_timer );
   _Watchdog_Initialize(
     &api->Sporadic_timer,
     _POSIX_Threads_Sporadic_budget_TSR,
diff --git a/cpukit/rtems/include/rtems/rtems/asrimpl.h b/cpukit/rtems/include/rtems/rtems/asrimpl.h
index 38ee35d..bcfb69a 100644
--- a/cpukit/rtems/include/rtems/rtems/asrimpl.h
+++ b/cpukit/rtems/include/rtems/rtems/asrimpl.h
@@ -51,7 +51,7 @@ RTEMS_INLINE_ROUTINE void _ASR_Initialize (
 RTEMS_INLINE_ROUTINE void _ASR_Create( ASR_Information *asr )
 {
   _ISR_lock_Initialize( &asr->Lock, "ASR" );
-  _ASR_Initialize( asr );
+  RTEMS_STATIC_ASSERT( RTEMS_DEFAULT_MODES == 0, _ASR_Create_mode_set );
 }
 
 RTEMS_INLINE_ROUTINE void _ASR_Destroy( ASR_Information *asr )
diff --git a/cpukit/rtems/src/tasks.c b/cpukit/rtems/src/tasks.c
index c4eca04..f5ba1c1 100644
--- a/cpukit/rtems/src/tasks.c
+++ b/cpukit/rtems/src/tasks.c
@@ -55,21 +55,6 @@ static bool _RTEMS_tasks_Create_extension(
   api = created->API_Extensions[ THREAD_API_RTEMS ];
 
   _ASR_Create( &api->Signal );
-  _Thread_Action_initialize( &api->Signal_action );
-#if !defined(RTEMS_SMP)
-  created->task_variables = NULL;
-#endif
-
-  /*
-   * We know this is deprecated and don't want a warning on every BSP built.
-   */
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-  if ( rtems_configuration_get_notepads_enabled() ) {
-    for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
-      api->Notepads[i] = 0;
-  }
-  #pragma GCC diagnostic pop
 
   return true;
 }
diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c
index 335448d..a49406f 100644
--- a/cpukit/score/src/threadinitialize.c
+++ b/cpukit/score/src/threadinitialize.c
@@ -61,6 +61,12 @@ bool _Thread_Initialize(
   }
 #endif
 
+  memset(
+    &the_thread->current_state,
+    0,
+    information->Objects.size - offsetof( Thread_Control, current_state )
+  );
+
   for ( i = 0 ; i < _Thread_Control_add_on_count ; ++i ) {
     const Thread_Control_add_on *add_on = &_Thread_Control_add_ons[ i ];
 
@@ -69,16 +75,6 @@ bool _Thread_Initialize(
   }
 
   /*
-   *  Initialize the Ada self pointer
-   */
-  #if __RTEMS_ADA__
-    the_thread->rtems_ada_self = NULL;
-  #endif
-
-  the_thread->Start.tls_area = NULL;
-  the_thread->Wait.spare_heads = NULL;
-
-  /*
    *  Allocate and Initialize the stack for this thread.
    */
   #if !defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
@@ -149,28 +145,12 @@ bool _Thread_Initialize(
   }
   _Thread_queue_Heads_initialize( the_thread->Wait.spare_heads );
 
-  /*
-   *  Initialize the thread timer
-   */
-  _Watchdog_Preinitialize( &the_thread->Timer );
-
   #ifdef __RTEMS_STRICT_ORDER_MUTEX__
     /* Initialize the head of chain of held mutexes */
     _Chain_Initialize_empty(&the_thread->lock_mutex);
   #endif
 
   /*
-   * Clear the extensions area so extension users can determine
-   * if they are linked to the thread. An extension user may
-   * create the extension long after tasks have been created
-   * so they cannot rely on the thread create user extension
-   * call.  The object index starts with one, so the first extension context is
-   * unused.
-   */
-  for ( i = 1 ; i <= rtems_configuration_get_maximum_extensions() ; ++i )
-    the_thread->extensions[ i ] = NULL;
-
-  /*
    *  General initialization
    */
 
@@ -197,17 +177,15 @@ bool _Thread_Initialize(
   }
 
 #if defined(RTEMS_SMP)
-  the_thread->Scheduler.state = THREAD_SCHEDULER_BLOCKED;
+  RTEMS_STATIC_ASSERT( THREAD_SCHEDULER_BLOCKED == 0, Scheduler_state );
   the_thread->Scheduler.own_control = scheduler;
   the_thread->Scheduler.control = scheduler;
   the_thread->Scheduler.own_node = the_thread->Scheduler.node;
   _Resource_Node_initialize( &the_thread->Resource_node );
-  _CPU_Context_Set_is_executing( &the_thread->Registers, false );
   the_thread->Lock.current = &the_thread->Lock.Default;
   _SMP_ticket_lock_Initialize( &the_thread->Lock.Default );
   _SMP_lock_Stats_initialize( &the_thread->Lock.Stats, "Thread Lock" );
   _SMP_lock_Stats_initialize( &the_thread->Potpourri_stats, "Thread Potpourri" );
-  _Atomic_Init_uint(&the_thread->Lock.generation, 0);
 #endif
 
   _Thread_Debug_set_real_processor( the_thread, cpu );
@@ -216,15 +194,12 @@ bool _Thread_Initialize(
   _Thread_Set_CPU( the_thread, cpu );
 
   the_thread->current_state           = STATES_DORMANT;
-  the_thread->Wait.queue              = NULL;
   the_thread->Wait.operations         = &_Thread_queue_Operations_default;
-  the_thread->resource_count          = 0;
   the_thread->current_priority        = priority;
   the_thread->real_priority           = priority;
-  the_thread->priority_generation     = 0;
   the_thread->Start.initial_priority  = priority;
 
-  _Thread_Wait_flags_set( the_thread, THREAD_WAIT_FLAGS_INITIAL );
+  RTEMS_STATIC_ASSERT( THREAD_WAIT_FLAGS_INITIAL == 0, Wait_flags );
 
   _Scheduler_Node_initialize( scheduler, the_thread );
   scheduler_node_initialized = true;
@@ -232,23 +207,13 @@ bool _Thread_Initialize(
   _Scheduler_Update_priority( the_thread, priority );
 
   /*
-   *  Initialize the CPU usage statistics
-   */
-  _Timestamp_Set_to_zero( &the_thread->cpu_time_used );
-
-  /*
    * initialize thread's key vaule node chain
    */
   _Chain_Initialize_empty( &the_thread->Key_Chain );
 
   _Thread_Action_control_initialize( &the_thread->Post_switch_actions );
 
-  _Thread_Action_initialize( &the_thread->Life.Action );
-  the_thread->Life.state = THREAD_LIFE_NORMAL;
-  the_thread->Life.terminator = NULL;
-
-  the_thread->Capture.flags = 0;
-  the_thread->Capture.control = NULL;
+  RTEMS_STATIC_ASSERT( THREAD_LIFE_NORMAL == 0, Life_state );
 
   /*
    *  Open the object



More information about the vc mailing list