Changeset 2e2c640e in rtems


Ignore:
Timestamp:
Jul 24, 2008, 12:44:26 PM (11 years ago)
Author:
Thomas Doerfler <Thomas.Doerfler@…>
Branches:
4.10, 4.11, 4.9, master
Children:
075d817
Parents:
a39cf49
Message:

Support for new rtems_interrupt_handler_iterate() function.

Location:
c/src/lib/libbsp/shared
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/shared/ChangeLog

    ra39cf49 r2e2c640e  
     12008-07-24      Sebastian Huber <sebastian.huber@embedded-brains.de>
     2
     3        * include/irq-generic.h, src/irq-generic.c, src/irq-legacy.c: Support
     4        for new rtems_interrupt_handler_iterate() function.
     5
    162008-07-15      Joel Sherrill <joel.sherrill@oarcorp.com>
    27
  • c/src/lib/libbsp/shared/include/irq-generic.h

    ra39cf49 r2e2c640e  
    236236/** @} */
    237237
    238 rtems_status_code bsp_interrupt_handler_query( rtems_vector_number vector, bsp_interrupt_handler_entry *head);
    239 
    240 rtems_status_code bsp_interrupt_handler_query_free( bsp_interrupt_handler_entry *head);
    241 
    242238#ifdef __cplusplus
    243239}
  • c/src/lib/libbsp/shared/src/irq-generic.c

    ra39cf49 r2e2c640e  
    484484}
    485485
    486 rtems_status_code rtems_interrupt_handler_install( rtems_vector_number vector, const char *info, rtems_option options, rtems_interrupt_handler handler, void *arg)
    487 {
    488         return bsp_interrupt_handler_install( vector, info, options, handler, arg);
    489 }
    490 
    491 rtems_status_code rtems_interrupt_handler_remove( rtems_vector_number vector, rtems_interrupt_handler handler, void *arg)
    492 {
    493         return bsp_interrupt_handler_remove( vector, handler, arg);
    494 }
    495 
    496 rtems_status_code bsp_interrupt_handler_query( rtems_vector_number vector, bsp_interrupt_handler_entry *head)
     486/**
     487 * @brief Iterates over all installed interrupt handler of a vector.
     488 *
     489 * @ingroup bsp_interrupt
     490 *
     491 * @return In addition to the standard status codes this function returns
     492 * RTEMS_INTERNAL_ERROR if the BSP interrupt support is not initialized.
     493 *
     494 * @see rtems_interrupt_handler_iterate().
     495 */
     496static rtems_status_code bsp_interrupt_handler_iterate( rtems_vector_number vector, rtems_interrupt_per_handler_routine routine, void *arg)
    497497{
    498498        rtems_status_code sc = RTEMS_SUCCESSFUL;
    499         bsp_interrupt_handler_entry *current_input = NULL;
    500         bsp_interrupt_handler_entry *current_output = NULL;
    501 
    502         /* Terminate list */
    503         head = NULL;
     499        bsp_interrupt_handler_entry *current = NULL;
     500        rtems_option options = 0;
     501        rtems_vector_number index = 0;
    504502
    505503        /* Check parameters and system state */
     
    518516        }
    519517
    520         /* Fill output list */
    521         current_input = &bsp_interrupt_handler_table [bsp_interrupt_handler_index( vector)];
    522         if (!bsp_interrupt_is_empty_handler_entry( current_input)) {
     518        /* Interate */
     519        index = bsp_interrupt_handler_index( vector);
     520        current = &bsp_interrupt_handler_table [index];
     521        if (!bsp_interrupt_is_empty_handler_entry( current)) {
    523522                do {
    524                         bsp_interrupt_handler_entry *e = malloc( sizeof( bsp_interrupt_handler_entry));
    525                         if (e == NULL) {
    526                                 bsp_interrupt_handler_query_free( head);
    527                                 bsp_interrupt_unlock();
    528                                 return RTEMS_NO_MEMORY;
    529                         }
    530                         *e = *current_input;
    531                         e->next = NULL;
    532                         if (head == NULL) {
    533                                 head = e;
    534                                 current_output = head;
    535                         } else {
    536                                 current_output->next = e;
    537                                 current_output = current_output->next;
    538                         }
    539                         current_input = current_input->next;
    540                 } while (current_input != NULL);
     523                        options = bsp_interrupt_is_handler_unique( index) ? RTEMS_INTERRUPT_UNIQUE : RTEMS_INTERRUPT_SHARED;
     524                        routine( arg, current->info, options, current->handler, current->arg);
     525                        current = current->next;
     526                } while (current != NULL);
    541527        }
    542528
     
    550536}
    551537
    552 rtems_status_code bsp_interrupt_handler_query_free( bsp_interrupt_handler_entry *head)
    553 {
    554         rtems_status_code sc = RTEMS_SUCCESSFUL;
    555         bsp_interrupt_handler_entry *next = NULL;
    556 
    557         /* Free list */
    558         while (head != NULL) {
    559                 next = head->next;
    560                 free( head);
    561                 head = next;
    562         }
    563 
    564         return RTEMS_SUCCESSFUL;
    565 }
     538rtems_status_code rtems_interrupt_handler_install( rtems_vector_number vector, const char *info, rtems_option options, rtems_interrupt_handler handler, void *arg)
     539{
     540        return bsp_interrupt_handler_install( vector, info, options, handler, arg);
     541}
     542
     543rtems_status_code rtems_interrupt_handler_remove( rtems_vector_number vector, rtems_interrupt_handler handler, void *arg)
     544{
     545        return bsp_interrupt_handler_remove( vector, handler, arg);
     546}
     547
     548rtems_status_code rtems_interrupt_handler_iterate( rtems_vector_number vector, rtems_interrupt_per_handler_routine routine, void *arg)
     549{
     550        return bsp_interrupt_handler_iterate( vector, routine, arg);
     551}
  • c/src/lib/libbsp/shared/src/irq-legacy.c

    ra39cf49 r2e2c640e  
    1919 */
    2020
     21#include <stdbool.h>
    2122#include <stdlib.h>
    2223
     
    3031} bsp_interrupt_legacy_entry;
    3132
     33typedef struct {
     34        rtems_irq_hdl handler;
     35        void *handler_arg;
     36        bsp_interrupt_legacy_entry *legacy_handler_arg;
     37} bsp_interrupt_legacy_iterate_entry;
     38
    3239static void bsp_interrupt_legacy_dispatch( rtems_vector_number vector, void *arg)
    3340{
    34         bsp_interrupt_legacy_entry *e = arg;
     41        bsp_interrupt_legacy_entry *e = (bsp_interrupt_legacy_entry *) arg;
    3542        e->handler( e->arg);
     43}
     44
     45static void bsp_interrupt_legacy_per_handler_routine(
     46        void *arg,
     47        const char *info,
     48        rtems_option options,
     49        rtems_interrupt_handler handler,
     50        void *handler_arg
     51)
     52{
     53        bsp_interrupt_legacy_iterate_entry *ie = (bsp_interrupt_legacy_iterate_entry *) arg;
     54        bsp_interrupt_legacy_entry *e = NULL;
     55
     56        if (handler == bsp_interrupt_legacy_dispatch) {
     57                e = (bsp_interrupt_legacy_entry *) handler_arg;
     58                if (e->handler == ie->handler && e->arg == ie->handler_arg) {
     59                        ie->legacy_handler_arg = e;
     60                }
     61        }
    3662}
    3763
     
    4672        cd->off = NULL;
    4773        cd->isOn = NULL;
     74
     75        return 1;
    4876}
    4977
     
    75103        }
    76104
    77         if (cd->on) {
     105        if (cd->on != NULL) {
    78106                cd->on( cd);
    79107        }
     
    109137        }
    110138
    111         if (cd->on) {
     139        if (cd->on != NULL) {
    112140                cd->on( cd);
    113141        }
     
    122150{
    123151        rtems_status_code sc = RTEMS_SUCCESSFUL;
    124         bsp_interrupt_handler_entry *head = NULL;
    125         bsp_interrupt_handler_entry *current = NULL;
    126         bsp_interrupt_legacy_entry *e = NULL;
     152        bsp_interrupt_legacy_iterate_entry e = {
     153                .handler = cd->hdl,
     154                .handler_arg = cd->handle,
     155                .legacy_handler_arg = NULL
     156        };
    127157
    128         sc = bsp_interrupt_handler_query( cd->name, head);
     158        sc = rtems_interrupt_handler_iterate( cd->name, bsp_interrupt_legacy_per_handler_routine, &e);
    129159        if (sc != RTEMS_SUCCESSFUL) {
    130160                return 0;
    131161        }
    132162
    133         current = head;
    134         while (current != NULL) {
    135                 if (current->handler == bsp_interrupt_legacy_dispatch) {
    136                         e = current->arg;
    137                         if (e->arg == cd->handle) {
    138                                 break;
    139                         } else {
    140                                 e = NULL;
    141                         }
    142                 }
    143                 current = current->next;
     163        if (e.legacy_handler_arg == NULL) {
     164                return 0;
    144165        }
    145166
    146         sc = bsp_interrupt_handler_query_free( head);
     167        if (cd->off != NULL) {
     168                cd->off( cd);
     169        }
     170
     171        sc = rtems_interrupt_handler_remove( cd->name, bsp_interrupt_legacy_dispatch, e.legacy_handler_arg);
    147172        if (sc != RTEMS_SUCCESSFUL) {
    148173                return 0;
    149174        }
    150175
    151         if (e == NULL) {
    152                 return 0;
    153         }
    154 
    155         if (cd->off) {
    156                 cd->off( cd);
    157         }
    158         sc = rtems_interrupt_handler_remove( cd->name, bsp_interrupt_legacy_dispatch, e);
    159         if (sc != RTEMS_SUCCESSFUL) {
    160                 return 0;
    161         }
    162176        return 1;
    163177}
Note: See TracChangeset for help on using the changeset viewer.