On 3/3/22 07:43, Adrian Moreno wrote:
> Thanks for the review Dumitru,
> 
> A comment below.
> 
> On 2/25/22 13:06, Dumitru Ceara wrote:
>> On 2/16/22 15:27, Adrian Moreno wrote:
>>> Multi-variable loop iterators avoid potential undefined behavior by
>>> using an internal iterator variable to perform the iteration and only
>>> referencing the containing object (via OBJECT_CONTAINING) if the
>>> iterator has been validated via the second expression of the for
>>> statement.
>>>
>>> That way, the user can easily implement a loop that never tries to
>>> obtain the object containing NULL or stack-allocated non-contained
>>> nodes.
>>>
>>> When the loop ends normally (not via "break;") the user-provided
>>> variable is set to NULL.
>>>
>>> Signed-off-by: Adrian Moreno <amore...@redhat.com>
>>> ---
>>
>> Hi Adrian,
>>
>> It feels a bit weird that these new macros are not used anywhere yet
>> (until we apply the next patches in the series).  On the other hand I
>> don't think it's easy to split the series otherwise so, with a small nit
>> below:
>>
>> Acked-by: Dumitru Ceara <dce...@redhat.com>
>>
>> Thanks,
>> Dumitru
>>
>>>   include/openvswitch/util.h | 44 ++++++++++++++++++++++++++++++++++++++
>>>   1 file changed, 44 insertions(+)
>>>
>>> diff --git a/include/openvswitch/util.h b/include/openvswitch/util.h
>>> index 228b185c3..9c09e8aea 100644
>>> --- a/include/openvswitch/util.h
>>> +++ b/include/openvswitch/util.h
>>> @@ -145,6 +145,50 @@ OVS_NO_RETURN void ovs_assert_failure(const char
>>> *, const char *, const char *);
>>>   #define INIT_CONTAINER(OBJECT, POINTER, MEMBER) \
>>>       ((OBJECT) = NULL, ASSIGN_CONTAINER(OBJECT, POINTER, MEMBER))
>>>   +
>>
>> Nit: We don't need this extra line.
>>
>>> +/* Multi-variable container iterators.
>>> + *
>>> + * The following macros facilitate safe iteration over data structures
>>> + * contained in objects. It does so by using an internal iterator
>>> variable of
>>> + * the type of the member object pointer (i.e: pointer to the data
>>> structure).
>>> + */
>>> +
>>> +/* Multi-variable iterator variable name.
>>> + * Returns the name of the internal iterator variable.
>>> + */
>>> +#define ITER_VAR(NAME) NAME ## __iterator__
>>> +
>>> +/* Multi-variable initialization. Creates an internal iterator
>>> variable that
>>> + * points to the provided pointer. The type of the iterator variable is
>>> + * ITER_TYPE*. It must be the same type as &VAR->MEMBER.
>>> + *
>>> + * The _EXP version evaluates the extra expressions once.
>>> + */
>>> +#define INIT_MULTIVAR(VAR, MEMBER, POINTER,
>>> ITER_TYPE)                  \
>>> +    INIT_MULTIVAR_EXP(VAR, MEMBER, POINTER, ITER_TYPE, (void) 0)
>>> +
>>> +#define INIT_MULTIVAR_EXP(VAR, MEMBER, POINTER, ITER_TYPE,
>>> ...)         \
>>> +    ITER_TYPE *ITER_VAR(VAR) = ( __VA_ARGS__ , (ITER_TYPE *) POINTER)
>>> +
>>> +/* Multi-variable condition.
>>> + * Evaluates the condition expression (that must be based on the
>>> internal
>>> + * iterator variable). Only if the result of expression is true, the
>>> OBJECT is
>>> + * set to the object containing the current value of the iterator
>>> variable.
>>> + *
>>> + * It is up to the caller to make sure it is safe to run
>>> OBJECT_CONTAINING on
>>> + * the pointers that verify the condition.
>>> + */
>>> +#define CONDITION_MULTIVAR(VAR, MEMBER,
>>> EXPR)                                 \
>>> +    ((EXPR)
>>> ?                                                                 \
>>> +     (((VAR) = OBJECT_CONTAINING(ITER_VAR(VAR), VAR, MEMBER)), 1)
>>> :           \
>>> +     (((VAR) = NULL), 0))
>>> +
>>> +/* Multi-variable update.
>>> + * Evaluates the expresssion that is supposed to update the iterator
>>> variable.
>>> + */
>>> +#define UPDATE_MULTIVAR(VAR,
>>> EXPR)                                            \
>>> +    ((EXPR), (VAR) = NULL)
>>> +
> 
> Setting VAR = NULL here may not really be needed. The CONDITION is
> evaluated just after the UPDATE stage and it sets VAR appropriately.
> 

Good point.  The same is true for the _SAFE_* versions in the next patch
too, right?

> If you agree, I'll remove the entire UPDATE macro alongside the extra
> line and the extra "s" in "expression" in the next version.
> 

Sounds good to me, thanks!

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to