Pavel, Feel free to commit the patch.
Why do you think the warning is a false positive? --joel On Tue, Apr 25, 2017 at 4:53 AM, Pavel Pisa <ppisa4li...@pikron.com> wrote: > From 3a2957faeb744af08196f1fd3baac71f15d76c85 Mon Sep 17 00:00:00 2001 > Message-Id: <3a2957faeb744af08196f1fd3baac71f15d76c85.1493113587.git. > pp...@pikron.com> > From: Pavel Pisa <pp...@pikron.com> > Date: Tue, 25 Apr 2017 11:45:57 +0200 > Subject: [PATCH] bsp/raspberrypi: GPIO silence warning and ensure that > lock is > always released. > To: rtems-de...@rtems.org > > Signed-off-by: Pavel Pisa <pp...@pikron.com> > --- > c/src/lib/libbsp/shared/gpio.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > Not tested or even compiled quick fix of warning and more serious real > problem. > The waning seems to be GCC false positive. The first iteration > (i == 0) sets *bank_number for sure. But return with RTEMS_INVALID_ID can > happen without lock release. > > diff --git a/c/src/lib/libbsp/shared/gpio.c b/c/src/lib/libbsp/shared/ > gpio.c > index 9ceeb407..bf0e415 100644 > --- a/c/src/lib/libbsp/shared/gpio.c > +++ b/c/src/lib/libbsp/shared/gpio.c > @@ -303,6 +303,7 @@ static rtems_status_code get_pin_bitmask( > uint32_t pin_number; > uint32_t bank; > uint8_t i; > + int locked_bank = -1; > > if ( pin_count < 1 ) { > return RTEMS_UNSATISFIED; > @@ -314,18 +315,23 @@ static rtems_status_code get_pin_bitmask( > pin_number = pins[i]; > > if ( pin_number < 0 || pin_number >= BSP_GPIO_PIN_COUNT ) { > + if (locked_bank >= 0) > + RELEASE_LOCK(gpio_bank_state[locked_bank].lock); > + > return RTEMS_INVALID_ID; > } > > bank = BANK_NUMBER(pin_number); > > - if ( i == 0 ) { > + if ( locked_bank < 0 ) { > *bank_number = bank; > + locked_bank = bank; > > - ACQUIRE_LOCK(gpio_bank_state[bank].lock); > + ACQUIRE_LOCK(gpio_bank_state[locked_bank].lock); > } > - else if ( bank != *bank_number ) { > - RELEASE_LOCK(gpio_bank_state[*bank_number].lock); > + else if ( bank != locked_bank ) { > + if (locked_bank >= 0) > + RELEASE_LOCK(gpio_bank_state[locked_bank].lock); > > return RTEMS_UNSATISFIED; > } > @@ -334,7 +340,7 @@ static rtems_status_code get_pin_bitmask( > gpio_pin_state[pin_number].pin_function != function || > gpio_pin_state[pin_number].on_group > ) { > - RELEASE_LOCK(gpio_bank_state[bank].lock); > + RELEASE_LOCK(gpio_bank_state[locked_bank].lock); > > return RTEMS_NOT_CONFIGURED; > } > @@ -342,7 +348,7 @@ static rtems_status_code get_pin_bitmask( > *bitmask |= (1 << PIN_NUMBER(pin_number)); > } > > - RELEASE_LOCK(gpio_bank_state[bank].lock); > + RELEASE_LOCK(gpio_bank_state[locked_bank].lock); > > return RTEMS_SUCCESSFUL; > } > -- > 1.9.1 > >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel