[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