[rtems commit] rtems: Fix ASR SMP support

Sebastian Huber sebh at rtems.org
Wed May 7 15:48:44 UTC 2014


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed May  7 17:53:48 2014 +0200

rtems: Fix ASR SMP support

Initialize the ISR lock only once and destroy it properly.

---

 cpukit/rtems/include/rtems/rtems/asrimpl.h |   10 ++++++++++
 cpukit/rtems/src/tasks.c                   |   17 ++++++++++++++---
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/cpukit/rtems/include/rtems/rtems/asrimpl.h b/cpukit/rtems/include/rtems/rtems/asrimpl.h
index 4d8d7f4..38ee35d 100644
--- a/cpukit/rtems/include/rtems/rtems/asrimpl.h
+++ b/cpukit/rtems/include/rtems/rtems/asrimpl.h
@@ -46,7 +46,17 @@ RTEMS_INLINE_ROUTINE void _ASR_Initialize (
   asr->signals_posted  = 0;
   asr->signals_pending = 0;
   asr->nest_level      = 0;
+}
+
+RTEMS_INLINE_ROUTINE void _ASR_Create( ASR_Information *asr )
+{
   _ISR_lock_Initialize( &asr->Lock, "ASR" );
+  _ASR_Initialize( asr );
+}
+
+RTEMS_INLINE_ROUTINE void _ASR_Destroy( ASR_Information *asr )
+{
+  _ISR_lock_Destroy( &asr->Lock );
 }
 
 /**
diff --git a/cpukit/rtems/src/tasks.c b/cpukit/rtems/src/tasks.c
index f989fff..c8c0acc 100644
--- a/cpukit/rtems/src/tasks.c
+++ b/cpukit/rtems/src/tasks.c
@@ -56,7 +56,7 @@ static bool _RTEMS_tasks_Create_extension(
 
   _Event_Initialize( &api->Event );
   _Event_Initialize( &api->System_event );
-  _ASR_Initialize( &api->Signal );
+  _ASR_Create( &api->Signal );
   _Thread_Action_initialize( &api->Signal_action, _Signal_Action_handler );
 #if !defined(RTEMS_SMP)
   created->task_variables = NULL;
@@ -90,11 +90,22 @@ static void _RTEMS_tasks_Start_extension(
   _Event_Initialize( &api->System_event );
 }
 
+static void _RTEMS_tasks_Delete_extension(
+  Thread_Control *executing,
+  Thread_Control *deleted
+)
+{
+  RTEMS_API_Control *api;
+
+  api = deleted->API_Extensions[ THREAD_API_RTEMS ];
+
+  _ASR_Destroy( &api->Signal );
+}
+
 static void _RTEMS_tasks_Terminate_extension(
   Thread_Control *executing
 )
 {
-
   /*
    *  Free per task variable memory
    *
@@ -172,7 +183,7 @@ User_extensions_Control _RTEMS_tasks_User_extensions = {
   { _RTEMS_tasks_Create_extension,            /* create */
     _RTEMS_tasks_Start_extension,             /* start */
     _RTEMS_tasks_Start_extension,             /* restart */
-    NULL,                                     /* delete */
+    _RTEMS_tasks_Delete_extension,            /* delete */
     RTEMS_TASKS_SWITCH_EXTENSION,             /* switch */
     NULL,                                     /* begin */
     NULL,                                     /* exitted */




More information about the vc mailing list