On Thu, Nov 30, 2023 at 5:40 PM Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> wrote: > > On Thu, Nov 30, 2023 at 02:46:29PM +0100, Bartosz Golaszewski wrote: > > From: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxx> > > > > Rework for_each_requested_gpio_in_range() to use the new helper to > > retrieve a dynamically allocated copy of the descriptor label and free > > it at the end of each iteration. We need to leverage the CLASS()' > > destructor to make sure that the label is freed even when breaking out > > of the loop. > > ... > > > const char *gpiochip_is_requested(struct gpio_chip *gc, unsigned int offset); > > char *gpiochip_dup_line_label(struct gpio_chip *gc, unsigned int offset); > > > > + > > One blank line is enough. > > > +struct _gpiochip_for_each_data { > > + const char **label; > > + int *i; > > Why is this a signed? > Some users use signed, others use unsigned. It doesn't matter as we can't overflow it with the limit on the lines we have. Bart > > +}; > > ... > > > +DEFINE_CLASS(_gpiochip_for_each_data, > > + struct _gpiochip_for_each_data, > > + if (*_T.label) kfree(*_T.label), > > + ({ struct _gpiochip_for_each_data _data = { label, i }; > > + *_data.i = 0; > > + _data; }), > > To me indentation of ({}) is quite weird. Where is this style being used > instead of more readable > There are no guidelines for this type of C abuse AFAIK. The macro may be ugly but at least it hides the details from users which look nice instead. Bart > ({ > ... > }) > > ? > > -- > With Best Regards, > Andy Shevchenko > >