I noticed while reading the code to install interrupts in GPIO that it does not clean-up in error case. There remains a similar problem in the "threaded" case as well that should be dealt with, and I'm filing a ticket for it.
On Mon, Nov 9, 2015 at 1:33 PM, Gedare Bloom <ged...@rtems.org> wrote: > --- > c/src/lib/libbsp/shared/gpio.c | 19 ++++++++----------- > 1 file changed, 8 insertions(+), 11 deletions(-) > > diff --git a/c/src/lib/libbsp/shared/gpio.c b/c/src/lib/libbsp/shared/gpio.c > index b806556..9ceeb407 100644 > --- a/c/src/lib/libbsp/shared/gpio.c > +++ b/c/src/lib/libbsp/shared/gpio.c > @@ -1708,10 +1708,8 @@ rtems_status_code rtems_gpio_enable_interrupt( > return RTEMS_RESOURCE_IN_USE; > } > > - interrupt_state = gpio_pin_state[pin_number].interrupt_state; > - > /* If an interrupt configuration is already in place for this pin. */ > - if ( interrupt_state != NULL ) { > + if ( gpio_pin_state[pin_number].interrupt_state != NULL ) { > RELEASE_LOCK(gpio_bank_state[bank].lock); > > return RTEMS_RESOURCE_IN_USE; > @@ -1724,15 +1722,12 @@ rtems_status_code rtems_gpio_enable_interrupt( > return RTEMS_NO_MEMORY; > } > > - gpio_pin_state[pin_number].interrupt_state->active_interrupt = NONE; > - gpio_pin_state[pin_number].interrupt_state->debouncing_tick_count = 0; > - gpio_pin_state[pin_number].interrupt_state->last_isr_tick = 0; > - > - rtems_chain_initialize_empty( > - &gpio_pin_state[pin_number].interrupt_state->handler_chain > - ); > - > interrupt_state = gpio_pin_state[pin_number].interrupt_state; > + interrupt_state->active_interrupt = NONE; > + interrupt_state->debouncing_tick_count = 0; > + interrupt_state->last_isr_tick = 0; > + > + rtems_chain_initialize_empty( &interrupt_state->handler_chain ); > > interrupt_state->active_interrupt = interrupt; > interrupt_state->handler_flag = flag; > @@ -1742,6 +1737,8 @@ rtems_status_code rtems_gpio_enable_interrupt( > sc = rtems_gpio_interrupt_handler_install(pin_number, handler, arg); > > if ( sc != RTEMS_SUCCESSFUL ) { > + free(interrupt_state); > + gpio_pin_state[pin_number].interrupt_state = NULL; > RELEASE_LOCK(gpio_bank_state[bank].lock); > > return RTEMS_UNSATISFIED; > -- > 1.9.1 > _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel