On 2/15/22 13:49, Adrian Moreno wrote:
> 
> 
> On 2/15/22 13:42, Adrian Moreno wrote:
>>
>>
>> On 2/14/22 18:30, Ilya Maximets wrote:
>>> On 2/14/22 11:13, Adrian Moreno wrote:
>>>> Using the SHORT version of the *_SAFE loops makes the code cleaner
>>>> and less error-prone. So, use the SHORT version and remove the extra
>>>> variable when possible.
>>>>
>>>> In order to be able to use both long and short versions without changing
>>>> the name of the macro for all the clients, overload the existing name
>>>> and select the appropriate version depending on the number of arguments.
>>>>
>>>> Signed-off-by: Adrian Moreno <amore...@redhat.com>
>>>> ---
>>>>   include/openvswitch/list.h   | 32 +++++++++++++++++++++++++++++--
>>>>   lib/conntrack.c              |  4 ++--
>>>>   lib/fat-rwlock.c             |  4 ++--
>>>>   lib/id-fpool.c               |  3 +--
>>>>   lib/ipf.c                    | 22 ++++++++++-----------
>>>>   lib/lldp/lldpd-structs.c     |  7 +++----
>>>>   lib/lldp/lldpd.c             |  8 ++++----
>>>>   lib/mcast-snooping.c         | 12 ++++++------
>>>>   lib/netdev-afxdp.c           |  4 ++--
>>>>   lib/netdev-dpdk.c            |  4 ++--
>>>>   lib/ofp-msgs.c               |  4 ++--
>>>>   lib/ovs-lldp.c               | 12 ++++++------
>>>>   lib/ovsdb-idl.c              | 30 ++++++++++++++---------------
>>>>   lib/seq.c                    |  4 ++--
>>>>   lib/tnl-ports.c              | 16 ++++++++--------
>>>>   lib/unixctl.c                |  8 ++++----
>>>>   lib/vconn.c                  |  4 ++--
>>>>   ofproto/connmgr.c            |  8 ++++----
>>>>   ofproto/ofproto-dpif-ipfix.c |  4 ++--
>>>>   ofproto/ofproto-dpif-trace.c |  4 ++--
>>>>   ofproto/ofproto-dpif-xlate.c |  4 ++--
>>>>   ofproto/ofproto-dpif.c       | 24 +++++++++++------------
>>>>   ovsdb/jsonrpc-server.c       | 16 ++++++++--------
>>>>   ovsdb/monitor.c              | 24 +++++++++++------------
>>>>   ovsdb/ovsdb.c                |  4 ++--
>>>>   ovsdb/raft.c                 | 15 +++++++--------
>>>>   ovsdb/transaction-forward.c  |  6 +++---
>>>>   ovsdb/transaction.c          | 28 +++++++++++++--------------
>>>>   ovsdb/trigger.c              |  4 ++--
>>>>   tests/test-list.c            | 37 ++++++++++++++++++++++++++++++++++++
>>>>   utilities/ovs-ofctl.c        |  4 ++--
>>>>   utilities/ovs-vsctl.c        |  8 ++++----
>>>>   vswitchd/bridge.c            | 16 ++++++++--------
>>>>   vtep/vtep-ctl.c              | 12 ++++++------
>>>>   34 files changed, 228 insertions(+), 168 deletions(-)
>>>>
>>>> diff --git a/include/openvswitch/list.h b/include/openvswitch/list.h
>>>> index 997afc0e4..c6941e896 100644
>>>> --- a/include/openvswitch/list.h
>>>> +++ b/include/openvswitch/list.h
>>>> @@ -93,7 +93,8 @@ static inline bool ovs_list_is_short(const struct 
>>>> ovs_list *);
>>>>            CONDITION_MULTIVAR(VAR, MEMBER, ITER_VAR(VAR) != (LIST));       
>>>>      \
>>>>            UPDATE_MULTIVAR(VAR, (ITER_VAR(VAR) = ITER_VAR(VAR)->prev)))
>>>> -#define LIST_FOR_EACH_REVERSE_SAFE(VAR, PREV, MEMBER, LIST)               
>>>>     \
>>>> +/* LONG version of SAFE iterators */
>>>> +#define LIST_FOR_EACH_REVERSE_SAFE_LONG(VAR, PREV, MEMBER, LIST)          
>>>>    \
>>>>       for (INIT_MULTIVAR_SAFE_LONG(VAR, PREV, MEMBER, (LIST)->prev);       
>>>>      \
>>>>            CONDITION_MULTIVAR_SAFE_LONG(VAR, PREV, MEMBER,                 
>>>>      \
>>>>                                         ITER_VAR(VAR) != (LIST),           
>>>>      \
>>>> @@ -101,7 +102,7 @@ static inline bool ovs_list_is_short(const struct 
>>>> ovs_list *);
>>>>                                         ITER_VAR(PREV) != (LIST));         
>>>>      \
>>>>            UPDATE_MULTIVAR_SAFE_LONG(VAR, PREV))
>>>> -#define LIST_FOR_EACH_SAFE(VAR, NEXT, MEMBER, LIST)                       
>>>>     \
>>>> +#define LIST_FOR_EACH_SAFE_LONG(VAR, NEXT, MEMBER, LIST)                  
>>>>     \
>>>>       for (INIT_MULTIVAR_SAFE_LONG(VAR, NEXT, MEMBER, (LIST)->next);       
>>>>      \
>>>>            CONDITION_MULTIVAR_SAFE_LONG(VAR, NEXT, MEMBER,                 
>>>>      \
>>>>                                         ITER_VAR(VAR) != (LIST),           
>>>>      \
>>>> @@ -109,6 +110,33 @@ static inline bool ovs_list_is_short(const struct 
>>>> ovs_list *);
>>>>                                         ITER_VAR(NEXT) != (LIST));         
>>>>      \
>>>>            UPDATE_MULTIVAR_SAFE_LONG(VAR, NEXT))
>>>> +/* SHORT version of SAFE iterators */
>>>> +#define LIST_FOR_EACH_REVERSE_SAFE_SHORT(VAR, MEMBER, LIST)               
>>>>     \
>>>> +    for (INIT_MULTIVAR_SAFE_SHORT(VAR, MEMBER, (LIST)->prev);             
>>>>     \
>>>> +         CONDITION_MULTIVAR_SAFE_SHORT(VAR, MEMBER,                       
>>>>     \
>>>> +                                       ITER_VAR(VAR) != (LIST),           
>>>>     \
>>>> +                                 ITER_NEXT_VAR(VAR) = 
>>>> ITER_VAR(VAR)->prev);   \
>>>> +         UPDATE_MULTIVAR_SAFE_SHORT(VAR))
>>>> +
>>>> +#define LIST_FOR_EACH_SAFE_SHORT(VAR, MEMBER, LIST)                       
>>>>     \
>>>> +    for (INIT_MULTIVAR_SAFE_SHORT(VAR, MEMBER, (LIST)->next);             
>>>>     \
>>>> +         CONDITION_MULTIVAR_SAFE_SHORT(VAR, MEMBER,                       
>>>>     \
>>>> +                                       ITER_VAR(VAR) != (LIST),           
>>>>     \
>>>> +                                 ITER_NEXT_VAR(VAR) = 
>>>> ITER_VAR(VAR)->next);   \
>>>> +         UPDATE_MULTIVAR_SAFE_SHORT(VAR))
>>>> +
>>>> +/* Select the right SAFE macro depending on the number of arguments .*/
>>>> +#define LIST_GET_SAFE_MACRO(_1, _2, _3, _4, NAME, ...) NAME
>>>> +#define LIST_FOR_EACH_SAFE(...)                                           
>>>>     \
>>>> +    LIST_GET_SAFE_MACRO(__VA_ARGS__,                                      
>>>>     \
>>>> +                   LIST_FOR_EACH_SAFE_LONG,                               
>>>>     \
>>>> +                   LIST_FOR_EACH_SAFE_SHORT)(__VA_ARGS__)
>>>
>>> Hey, Adrian.
>>>
>>> I should have said that upfront, but there is a reason I pointed to the
>>> stackoverflow answer related to MSVC.  It appears that MSVC preprocessor
>>> doesn't handle __VA_ARGS__ expansion in the same way as GCC and others
>>> do, unless experimental preprocessor is enabled.  So, it seem to require
>>> special handling:
>>>    
>>> https://developercommunity.visualstudio.com/t/-va-args-seems-to-be-trated-as-a-single-parameter/460154
>>>
>>> Did you check this patch set on Windows, e.g. with AppVeyor?
>>> In any case, we're requiring Visual Studio 2013+ to build OVS and this
>>> preprocessor thing doesn't seem to be fixed in that version.
>>>
>>> Best regards, Ilya Maximets.
>>>
>>
>> Hi Ilya,
>>
>> Thanks for pointing it out. I had not tried on Windows. In fact, there's a 
>> more serious problem with MVSC: it lacks typeof(). This whole approach is 
>> based on being able to declare a variable inside the loop of 
>> typeof(&VAR->MEMBER). So I wonder if it's even possible to do this on 
>> Windows without having to maintain two versions of all the loop macros.
>>
>> Thanks.
>>
> 
> I'll look into hardcoding the type, see if that's enough to please MVSC.
> 

Try OVS_TYPEOF macro.  It simply converts to void * in that case though.
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to