[rtems commit] bsps: Use interrupt lock for interrupt server

Sebastian Huber sebh at rtems.org
Fri Mar 6 10:24:40 UTC 2015


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Mar  5 14:54:09 2015 +0100

bsps: Use interrupt lock for interrupt server

---

 c/src/lib/libbsp/shared/src/irq-server.c | 33 ++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/c/src/lib/libbsp/shared/src/irq-server.c b/c/src/lib/libbsp/shared/src/irq-server.c
index 512e588..6cf22e1 100644
--- a/c/src/lib/libbsp/shared/src/irq-server.c
+++ b/c/src/lib/libbsp/shared/src/irq-server.c
@@ -7,12 +7,13 @@
  */
 
 /*
- * Copyright (c) 2009, 2010
- * embedded brains GmbH
- * Obere Lagerstr. 30
- * D-82178 Puchheim
- * Germany
- * <rtems at embedded-brains.de>
+ * Copyright (c) 2009, 2015 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems at embedded-brains.de>
  *
  * The license and distribution terms for this file may be
  * found in the file LICENSE in this distribution or at
@@ -28,6 +29,12 @@
 
 #define BSP_INTERRUPT_EVENT RTEMS_EVENT_13
 
+RTEMS_INTERRUPT_LOCK_DEFINE(
+  static,
+  bsp_interrupt_server_lock,
+  "Interrupt Server"
+)
+
 typedef struct bsp_interrupt_server_entry {
   rtems_chain_node node;
   rtems_vector_number vector;
@@ -57,7 +64,11 @@ static void bsp_interrupt_server_trigger(void *arg)
   bsp_interrupt_vector_disable(e->vector);
 
   if (e->node.next == NULL) {
-    rtems_chain_append(&bsp_interrupt_server_chain, &e->node);
+    rtems_interrupt_lock_context lock_context;
+
+    rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context);
+    rtems_chain_append_unprotected(&bsp_interrupt_server_chain, &e->node);
+    rtems_interrupt_lock_release(&bsp_interrupt_server_lock, &lock_context);
   } else {
     ++bsp_interrupt_server_errors;
   }
@@ -67,16 +78,18 @@ static void bsp_interrupt_server_trigger(void *arg)
 
 static bsp_interrupt_server_entry *bsp_interrupt_server_get_entry(void)
 {
-  rtems_interrupt_level level;
+  rtems_interrupt_lock_context lock_context;
   bsp_interrupt_server_entry *e;
 
-  rtems_interrupt_disable(level);
+  rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context);
+
   e = (bsp_interrupt_server_entry *)
     rtems_chain_get_unprotected(&bsp_interrupt_server_chain);
   if (e != NULL) {
     e->node.next = NULL;
   }
-  rtems_interrupt_enable(level);
+
+  rtems_interrupt_lock_release(&bsp_interrupt_server_lock, &lock_context);
 
   return e;
 }




More information about the vc mailing list