summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-06-23 11:51:14 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-06-26 08:23:33 +0200
commit5bfeab951c68ce358bac2946b8fbae26697d5675 (patch)
treebc7b4839f6203f6c92f2534fb051b274f533b394
parentpsxstat/test.c: Avoid potential string overflow (diff)
downloadrtems-5bfeab951c68ce358bac2946b8fbae26697d5675.tar.bz2
Add rtems_interrupt_server_handler_iterate()
-rw-r--r--c/src/lib/libbsp/shared/src/irq-server.c70
-rw-r--r--cpukit/include/rtems/irq-extension.h22
2 files changed, 92 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/shared/src/irq-server.c b/c/src/lib/libbsp/shared/src/irq-server.c
index 9a3ca9abf1..1f9b75ffd9 100644
--- a/c/src/lib/libbsp/shared/src/irq-server.c
+++ b/c/src/lib/libbsp/shared/src/irq-server.c
@@ -389,6 +389,76 @@ rtems_status_code rtems_interrupt_server_handler_remove(
);
}
+typedef struct {
+ rtems_interrupt_per_handler_routine routine;
+ void *arg;
+} bsp_interrupt_server_handler_iterate_helper_data;
+
+static void bsp_interrupt_server_handler_iterate_helper(void *arg)
+{
+ bsp_interrupt_server_helper_data *hd = arg;
+ bsp_interrupt_server_handler_iterate_helper_data *hihd = hd->arg;
+ rtems_status_code sc;
+ rtems_interrupt_server_entry *e;
+ rtems_option trigger_options;
+
+ bsp_interrupt_lock();
+
+ e = bsp_interrupt_server_query_entry(hd->vector, &trigger_options);
+ if (e != NULL) {
+ rtems_interrupt_server_action **link = &e->actions;
+ rtems_interrupt_server_action *c;
+
+ while ((c = *link) != NULL) {
+ (*hihd->routine)(hihd->arg, NULL, trigger_options, c->handler, c->arg);
+ link = &c->next;
+ }
+
+ sc = RTEMS_SUCCESSFUL;
+ } else {
+ sc = RTEMS_UNSATISFIED;
+ }
+
+ bsp_interrupt_unlock();
+
+ hd->sc = sc;
+ rtems_event_transient_send(hd->task);
+}
+
+rtems_status_code rtems_interrupt_server_handler_iterate(
+ rtems_id server,
+ rtems_vector_number vector,
+ rtems_interrupt_per_handler_routine routine,
+ void *arg
+)
+{
+ rtems_status_code sc;
+ bsp_interrupt_server_handler_iterate_helper_data hihd;
+
+ sc = bsp_interrupt_server_is_initialized();
+ if (sc != RTEMS_SUCCESSFUL) {
+ return sc;
+ }
+
+ if (server != RTEMS_ID_NONE) {
+ return RTEMS_NOT_IMPLEMENTED;
+ }
+
+ if (!bsp_interrupt_is_valid_vector(vector)) {
+ return RTEMS_INVALID_ID;
+ }
+
+ hihd.routine = routine;
+ hihd.arg = arg;
+ return bsp_interrupt_server_call_helper(
+ vector,
+ 0,
+ NULL,
+ &hihd,
+ bsp_interrupt_server_handler_iterate_helper
+ );
+}
+
rtems_status_code rtems_interrupt_server_initialize(
rtems_task_priority priority,
size_t stack_size,
diff --git a/cpukit/include/rtems/irq-extension.h b/cpukit/include/rtems/irq-extension.h
index 71ff800881..fec07675b8 100644
--- a/cpukit/include/rtems/irq-extension.h
+++ b/cpukit/include/rtems/irq-extension.h
@@ -333,6 +333,28 @@ rtems_status_code rtems_interrupt_server_handler_remove(
);
/**
+ * @brief Iterates over all interrupt handler of the interrupt vector with
+ * number @a vector which are installed on the interrupt server specified by
+ * @a server.
+ *
+ * A server identifier @a server of @c RTEMS_ID_NONE may be used to specify the
+ * default server.
+ *
+ * @see rtems_interrupt_handler_iterate()
+ *
+ * @retval RTEMS_SUCCESSFUL Shall be returned in case of success.
+ * @retval RTEMS_INCORRECT_STATE If the interrupt handler server is not
+ * initialized this shall be returned.
+ * @retval * For other errors see rtems_interrupt_handler_iterate().
+ */
+rtems_status_code rtems_interrupt_server_handler_iterate(
+ rtems_id server,
+ rtems_vector_number vector,
+ rtems_interrupt_per_handler_routine routine,
+ void *arg
+);
+
+/**
* @brief Initializes the specified interrupt server entry.
*
* @param[in] entry The interrupt server entry to initialize.