[rtems commit] rtems: Basic SMP support for timer server

Sebastian Huber sebh at rtems.org
Mon Jul 22 14:51:44 UTC 2013


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Jul 22 16:01:53 2013 +0200

rtems: Basic SMP support for timer server

---

 cpukit/rtems/src/timerserver.c |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/cpukit/rtems/src/timerserver.c b/cpukit/rtems/src/timerserver.c
index ef32f00..0dc69c5 100644
--- a/cpukit/rtems/src/timerserver.c
+++ b/cpukit/rtems/src/timerserver.c
@@ -345,6 +345,22 @@ static void _Timer_server_Get_watchdogs_that_fire_now(
   }
 }
 
+/* FIXME: This locking approach for SMP is improvable! */
+
+static void _Timer_server_SMP_lock_aquire( void )
+{
+#if defined( RTEMS_SMP )
+  _Thread_Disable_dispatch();
+#endif
+}
+
+static void _Timer_server_SMP_lock_release( void )
+{
+#if defined( RTEMS_SMP )
+  _Thread_Enable_dispatch();
+#endif
+}
+
 /**
  *  @brief Timer server body.
  *
@@ -365,6 +381,8 @@ static rtems_task _Timer_server_Body(
   _Chain_Initialize_empty( &insert_chain );
   _Chain_Initialize_empty( &fire_chain );
 
+  _Timer_server_SMP_lock_aquire();
+
   while ( true ) {
     _Timer_server_Get_watchdogs_that_fire_now( ts, &insert_chain, &fire_chain );
 
@@ -391,12 +409,16 @@ static rtems_task _Timer_server_Body(
           break;
         }
 
+        _Timer_server_SMP_lock_release();
+
         /*
          *  The timer server may block here and wait for resources or time.
          *  The system watchdogs are inactive and will remain inactive since
          *  the active flag of the timer server is true.
          */
         (*watchdog->routine)( watchdog->id, watchdog->user_data );
+
+        _Timer_server_SMP_lock_aquire();
       }
     } else {
       ts->active = false;
@@ -404,11 +426,18 @@ static rtems_task _Timer_server_Body(
       /*
        *  Block until there is something to do.
        */
+#if !defined( RTEMS_SMP )
       _Thread_Disable_dispatch();
+#endif
         _Thread_Set_state( ts->thread, STATES_DELAYING );
         _Timer_server_Reset_interval_system_watchdog( ts );
         _Timer_server_Reset_tod_system_watchdog( ts );
+#if !defined( RTEMS_SMP )
       _Thread_Enable_dispatch();
+#endif
+
+      _Timer_server_SMP_lock_release();
+      _Timer_server_SMP_lock_aquire();
 
       ts->active = true;
 




More information about the vc mailing list