[libvirt] [PATCH] interface: list all interfaces with flags == 0
Eric Blake
eblake at redhat.com
Tue May 21 14:49:57 UTC 2013
On 05/21/2013 06:49 AM, Guannan Ren wrote:
Guannan's logic says when to drop:
>>> + if (MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) &&
>>> + !((MATCH(VIR_CONNECT_LIST_INTERFACES_ACTIVE) &&
>>> + (status & NETCF_IFACE_ACTIVE)) ||
>>> + (MATCH(VIR_CONNECT_LIST_INTERFACES_INACTIVE) &&
>>> + (status & NETCF_IFACE_INACTIVE))))
>>> + continue;
Jirka's logic says when to keep; so it would need a ! around the overall
expression if we want to turn it into the condition that represents when
to drop.
>> if (!MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) ||
>> (MATCH(VIR_CONNECT_LIST_INTERFACES_ACTIVE) &&
>> (status & NETCF_IFACE_ACTIVE)) ||
>> (MATCH(VIR_CONNECT_LIST_INTERFACES_INACTIVE) &&
>> (status & NETCF_IFACE_INACTIVE)))
> yes, currently, there are only one group of flags with two
> values(active/inactive),
> the way of yours is better to read.
> if in future, there are more than one group of flags which are
> going to support,
> the way of my version will be better.
Let's compare what happens for all four combinations of the two flags
[active is flag 1, inactive is flag 2]:
flags status Guannan's [0 means keep] Jirka's [1 means keep]
0 active 0&&!(0||0)=keep !0||0||0=keep
0 inactive 0&&!(0||0)=keep !0||0||0=keep
1 active 1&&!(1||0)=keep !1||1||0=keep
1 inactive 1&&!(0||0)=drop !1||0||0=drop
2 active 1&&!(0||0)=drop !1||0||0=drop
2 inactive 1&&!(0||1)=keep !1||0||1=keep
3 active 1&&!(1||0)=keep !1||1||0=keep
3 inactive 1&&!(0||1)=keep !1||0||1=keep
Ultimately, the two expressions are equivalent (you can use deMorgan's
law to prove the equivalence), but I find Jirka's positive logic a bit
easier to reason with than Guannan's negative logic, even if Guannan's
style copied from how we did it on other API. I do agree that for
purposes of adding future filter groups, as well as minimizing nested
conditionals, that the logic looks better in terms of drop checks:
foreach item:
if (filter group 1 drops)
continue;
if (filter group 2 drops)
continue;
item was kept by all filters, add it to return
rather than logic in terms of keep checks:
foreach item:
if (filter group 1 keeps)
if (filter group 2 keeps)
add it to return
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130521/d87e53fa/attachment-0001.sig>
More information about the libvir-list
mailing list